2011-01-02 24 views
5

Ich SvcUtil.exe mit meinem WCF-Code zu generieren, wie folgt aus:Wie kann ich einen Namespace festlegen, ohne den Dienstkonfigurationsnamen mit SvcUtil.exe zu überschreiben?

SvcUtil.exe http://www.MyServer.com:8080/MyService/mex /out:"C:\test.cs" /mc 

Ich kann es die Arbeit, aber wenn ich ein /namespace Argument (/namespace:*,MyNamespace) gesetzt hinzufügen, überschreibt er den ConfigurationName Wert auf die erzeugte ServiceContractAttribute der erzeugten Schnittstelle:

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] 
[System.ServiceModel.ServiceContractAttribute(ConfigurationName="MyNamespace.MyServiceName")] 
public interface MyServiceName 
{ ... } 

Wenn ich den Wert von ConfigurationName nicht den Namespace gesetzt, ist „MyServiceName“, die richtige („MyNamespace.MyServiceName“ ist falsch und funktioniert nicht) ist. Ich habe versucht, das Hinzufügen eines/Servicename: MyService Argument, aber es sagt mir, dass es sagt

Error: The /serviceName: option conflicts with other options. Review your use of the tool.

Wie kann ich einen Namespace für meine generierten Klassen angeben, ohne die Configurationüberschreiben?

Antwort

8

Ich habe das gleiche Problem. Ich habe eine ServiceReference, die ConfigurationName = "MyWebService.MyWebServiceSoap" hat, die generiert wurde, als es über VisualStudio.NET 2010 hinzugefügt wurde. Wenn ich Svcutil verwenden, um dieselbe Klasse von Msbuild zu generieren, möchte Svcutil den ConfigurationName gleich dem Wert setzen, den ich festlegte für den Namespace. Also, wenn ich die/n wie so Attribut:

/n:*,MyApplication.MyWebService.MyWebServiceSoap 

ich den richtigen Namensraum für meine generierten Klassen, aber die Configuration wird auch MyApplication.MyWebService.MyWebServiceSoap gesetzt.

Dies scheint darauf hinzuweisen, dass VS.NET Svcutil nicht verwendet, und es gibt posts Ich fand, dass dies auch darauf hinweisen.

Ich wünschte, ich hätte eine bessere Antwort, aber da ich SVUCUTIL von MSBuild verwende, war meine Lösung, SVUCUTIL die Klasse mit dem falschen ConfigurationName generieren zu lassen und dann den FileUpdate Task zu verwenden, um diesen Namen mit einem Regex zu ändern. Auch dies ist alles andere als ideal, aber ich kann nichts in der SVUCUTIL-Dokumentation sehen, in der Sie den ConfigurationName angeben können.

Es ist auch erwähnenswert, dass die Option serviceName verwendet wird, um Metadaten aus kompiliertem Code zu exportieren, es ist nicht gültig für die Generierung von Client-Proxy-Klassen, was wahrscheinlich war, warum Sie diese ServiceName-Option Konflikte erhalten.

Siehe: http://msdn.microsoft.com/en-us/library/aa347733.aspx

2

keine direkte Antwort auf die Frage, aber der Grund, warum die Namensraum Änderung für Sie nicht funktioniert, dass wahrscheinlich zu aktualisieren Sie vergessen haben, um den Referenzkonfigurations Vertrag diesen Dienst.

In Ihrem app/Web-Config, suchen Sie nach dem

<client> 
    <endpoint .. contract="MyServiceName"> 
    </endpoint> 
</client> 

Blick auf das contract Attribut. Wenn Sie den Namespace in SVCutil nicht angegeben haben, wurde MyServiceName generiert, und in web.config haben Sie auf Ihren Dienstnamen nur mit dem Namen der Schnittstelle verwiesen. Nun, Ihre Schnittstelle in einem Namensraum ist, so müssen Sie die Konfiguration ändern zu lesen:

<client> 
    <endpoint .. contract="MyNamespace.MyServiceName"> 
    </endpoint> 
</client> 

Kurz gesagt, die ConfigurationName Eigenschaft in Attribute hat den Namespace und Klassennamen in dem contract Attribute Ihrer config Datei übereinstimmen .Es ist ein Schlüssel, durch den es die passende Konfiguration findet.