2011-01-02 26 views
5

Używam svcutil.exe do generowania mojego kodu WCF, tak:Jak ustawić obszar nazw bez zastępowania nazwy konfiguracji usługi za pomocą SvcUtil.exe?

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

mogę zmusić go do pracy, ale jeśli mogę ustawić dodać /namespace argument (/namespace:*,MyNamespace), nadpisuje wartość ConfigurationName na wygenerowany ServiceContractAttribute wygenerowanego interfejsu:

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

Jeśli nie ustawić nazw, wartość ConfigurationName jest „MyServiceName”, która jest poprawna („MyNamespace.MyServiceName” jest błędne i nie działa). Próbowałem dodanie/ServiceName: argumentu MyService, ale to mówi mi, że to mówi

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

Jak mogę podać nazw dla moich klas generowanych bez nadpisywania ConfigurationName?

Odpowiedz

8

Mam ten sam problem. Mam ServiceReference, który ma ConfigurationName = "MyWebService.MyWebServiceSoap", który został wygenerowany, gdy został dodany przez VisualStudio.NET 2010. Kiedy używam svcutil do wygenerowania tej samej klasy z msbuild, svcutil chce ustawić ConfigurationName równe wartości, którą ustawiłem dla przestrzeni nazw. Więc jeśli ja ustawić/n atrybut tak:

/n:*,MyApplication.MyWebService.MyWebServiceSoap 

uzyskać odpowiednią przestrzeń nazw dla moich wygenerowanych klas, ale ConfigurationName jest również ustawiony na MyApplication.MyWebService.MyWebServiceSoap.

To wydaje się wskazywać, że VS.NET nie używa svcutil, i są tam posts, które również wskazują na to.

Żałuję, że nie miałem lepszej odpowiedzi, ale ponieważ używam svcutil z MSBuild, moim rozwiązaniem było pozwolić svcutilowi ​​wygenerować klasę z niepoprawną nazwą ConfigurationName, a następnie użyć zadania FileUpdate do zmodyfikowania tej nazwy za pomocą wyrażenia regularnego. Ponownie, to daleki od ideału, ale nie widzę niczego w dokumentacji svcutil, która pozwala ci określić ConfigurationName.

Warto również wspomnieć, że opcja serviceName służy do eksportowania metadanych z skompilowanego kodu, nie jest ona ważna do generowania klas proxy klienta, co prawdopodobnie powoduje, że opcja serviceName powoduje konflikty błędów.

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

2

Nie bezpośrednią odpowiedź na pytanie, ale powód, dla którego zmiana nazw nie działa dla Ciebie jest to, że prawdopodobnie zapomniał zaktualizować odniesienia kontraktu config do tej usługi.

w aplikacji/web config, poszukaj Spójrz na atrybucie contract

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

. Kiedy nie określiłeś przestrzeni nazw w svcutil, wygenerowała ona MyServiceName, aw web.config odwołałeś się do swojej nazwy usługi za pomocą tylko nazwy interfejsu. Teraz twój interfejs jest wewnątrz przestrzeni nazw, więc trzeba zmienić config czytać:

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

w skrócie, nieruchomość w atrybucie ConfigurationName musi być zgodna z nazwą przestrzeni nazw i klasa w atrybut pliku configcontract .Jest to klucz, za pomocą którego znajduje pasującą konfigurację.