Frage

Ich habe ein problem in Bezug auf namespaces verwendet, durch meinen service Referenzen.Ich habe eine Reihe von WCF-Diensten, beispielsweise mit dem namespace MyCompany.Services.MyProduct (die tatsächliche namespaces mehr).
Als Teil von die Produkt, ich bin auch ein Beispiel für C# .NET-website.Diese Webanwendung verwendet den namespace MyCompany.MyProduct.

Während der anfänglichen Entwicklung, der service wurde Hinzugefügt, wie Sie einen Projektverweis auf die website und direkt verwendet.Ich benutzte ein factory-Muster, das gibt eine Objekt-Instanz implementiert MyCompany.Services.MyProduct.IMyService.So weit, So gut.

Nun möchte ich dies ändern, um ein Aktuelles service-Referenz.Nach dem hinzufügen der Referenz-und Eingabe MyCompany.Services.MyProduct in der textbox namespace generiert Klassen im namespace MyCompany.MyProduct.MyCompany.Services.MyProduct. SCHLECHT! Ich möchte nicht, dass zu ändern using Direktiven in mehreren stellen, nur weil ich mit einem proxy-Klasse.Also versuchte ich voranstellen, den namespace mit global::, aber das wird nicht akzeptiert.

Beachten Sie, dass ich noch nicht gelöscht, die original-Montage Referenzen noch nicht, und "reuse-Typen" aktiviert ist, aber keine Wiederverwendung fertig war, offenbar. Aber ich will nicht zu halten, die die assembly verweist etwa in meinem Beispiel-website, damit es funktioniert trotzdem.

Die einzige Lösung, die ich mir ausgedacht habe, so weit ist die Einstellung der Standard-namespace für meine web-Anwendung MyCompany (weil es kann nicht leer sein), und das hinzufügen der dienstreferenz als Services.MyProduct.Angenommen, ein Kunde will zu verwenden, meinem Beispiel-website als Ausgangspunkt und ändern Sie den Standard-namespace zu OtherCompany.Whatever, dies wird natürlich brechen mein workaround.

Gibt es eine gute Lösung für dieses problem?

Zusammenfassen:Ich möchte zum erzeugen einer service-Referenz-proxy in den ursprünglichen namespace, ohne Bezug auf die Montage.

Hinweis:Ich habe gesehen, diese Frage, aber es gab keine Lösung, die akzeptabel ist für meinen Anwendungsfall.


Edit:Als John Saunders vorgeschlagen, die ich eingereicht habe, einige von feedback an Microsoft zu diesem:
Feedback Element @ Microsoft Connect

War es hilfreich?

Lösung

Ich habe ein schreiben von dieser Lösung auf meinem blog.Die gleichen Informationen sind wirklich, aber vielleicht ein wenig weniger fragmentiert

Ich habe eine alternative gefunden zu verwenden svcutil.exe das zu erreichen, was ich will.Es (imo) macht die Aktualisierung der service-Referenz einfacher als erneutes ausführen des Dienstprogramms.

Sollten Sie explizit einen namespace-uri, die auf Ihrem ServiceContract und DataContracts (siehe weiter unten für Kommentar).

[ServiceContract(Namespace = "http://company.com/MyCompany.Services.MyProduct")]
public interface IService
{
    [OperationContract]
    CompositeType GetData();
}

[DataContract(Namespace = "http://company.com/MyCompany.Services.MyProduct")]
public class CompositeType
{
    // Whatever
}

Der namespace kann alles mögliche sein, aber technisch muss es sich um einen gültigen uri, also entschied ich mich für dieses Schema.Sie kann haben zu bauen, manuell, für Dinge, die später arbeiten, so zu tun, dass.

Sobald dies geschehen ist, aktivieren Sie das Alle Dateien Anzeigen option in den Projektmappen-Explorer.Erweitern Sie die service-Referenz, die Sie zuvor Hinzugefügt.Doppel-klicken Sie auf den Reference.svcmap Datei.

Es wird eine <NamespaceMappings /> element, das Sie Bearbeiten müssen.In meinem Beispiel:

<NamespaceMappings>
    <NamespaceMapping
        TargetNamespace="http://company.com/MyCompany.Services.MyProduct"
        ClrNamespace="MyCompany.Services.MyProduct" />
</NamespaceMappings>

Speichern Sie die Datei mit der rechten klicken Sie auf die service-Referenz und wählen Sie Update Service Reference.

Sie können beliebig viele Zuordnungen, wie Sie benötigen (die ich eigentlich brauchte zwei).Der Effekt ist der gleiche wie der svcutil /namespace: Ansatz, aber ohne die Befehlszeile verwenden util selbst, so dass für einfacher aktualisieren.

Unterschied mit svcutil

Der Nachteil dieses Ansatzes ist, dass Sie müssen verwenden Sie die explizite namespace-Zuordnungen.Verwendung svcutil, haben Sie die option, um die Karte alles, was nicht explizit abgebildet, wie dies (die Lösung John Saunders bezog sich auf):

svcutil /namespace:*,MyCompany.Services.MyProduct ...

Man könnte denken, Sie zu verwenden:

<NamespaceMappings>
    <NamespaceMapping
        TargetNamespace="*"
        ClrNamespace="MyCompany.Services.MyProduct" />
</NamespaceMappings>

aber das wird nicht Arbeit, da Visual Studio bereits implizit fügt dieses mapping, das auf die erzeugten namespace-Namen, die wir versuchen, um loszuwerden,.Die obige Konfiguration führen Sie Visual Studio, um sich über einen doppelten Schlüssel.

Ad explizite namespaces:
Wenn kein explit namespace angegeben ist, in Ihrem code, es scheint das .NET generieren eine uri der form http://schemas.datacontract.org/2004/07/MyCompany.Services.MyProduct.Sie könnten anzeigen, dass ebenso wie die explizite namespaces in meinem Beispiel, aber ich weiß nicht, ob es irgendeine Garantie für dieses Verhalten.Daher werde mit einer expliziten namespace besser sein könnte.

NB:mapping-zwei TargetNamespaces der gleichen ClrNamespace scheint zu brechen, code generation

Andere Tipps

Ihren Fall falsch war.

Sie sollten nie den service aufgenommen haben, die als Referenz in den ersten Platz.

Ich glaube, svcutil.exe akzeptiert einen Schalter Angabe des vollständigen namespace zu verwenden.

In VS2010 und späteren Versionen gibt es eine Möglichkeit zum einrichten von benutzerdefinierten namespaces.Im Projektmappen-explorer, wählen Sie "alle Dateien Anzeigen" öffnen Sie dann "Web references" in der Struktur der Lösung, wählen Sie den Dienst aus, wählen Sie die Referenz.Karte Knoten, zeigen Sie die Eigenschaften und setzen Sie das Benutzerdefinierte Tool-Namespace-Eigenschaft.

Leider habe ich nicht genug reputation, um zu zeigen, einen screenshot.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top