Как я могу установить пространство имен без перезаписи имени конфигурации службы с помощью SvcUtil.exe? - PullRequest
5 голосов
/ 02 января 2011

Я использую SvcUtil.exe для генерации моего кода WCF, например:

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

Я могу заставить его работать, но если я добавлю аргумент /namespace (/namespace:*,MyNamespace), он перезаписывает значение ConfigurationName в сгенерированном ServiceContractAttribute сгенерированного интерфейса:

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

Если я не установил пространство имен, значение ConfigurationName будет равно «MyServiceName», что является правильным («MyNamespace.MyServiceName» неверно и не работает). Я попытался добавить аргумент / ServiceName: MyService, но он говорит мне, что он говорит

Ошибка: параметр / serviceName: конфликтует с другими вариантами. Обзор ваше использование инструмента.

Как я могу указать пространство имен для моих сгенерированных классов без перезаписи ConfigurationName?

Ответы [ 2 ]

8 голосов
/ 03 февраля 2011

У меня та же проблема.У меня есть ServiceReference с ConfigurationName = "MyWebService.MyWebServiceSoap", который был сгенерирован, когда он был добавлен через VisualStudio.NET 2010. Когда я использую svcutil для создания этого же класса из msbuild, svcutil хочет установить ConfigurationName равным значению, которое я установилдля пространства имен.Поэтому, если я устанавливаю атрибут / n следующим образом:

/n:*,MyApplication.MyWebService.MyWebServiceSoap

, я получаю правильное пространство имен для моих сгенерированных классов, но для ConfigurationName также устанавливается значение MyApplication.MyWebService.MyWebServiceSoap.

ThisКажется, это указывает на то, что VS.NET не использует svcutil, и есть сообщений Я обнаружил, что, похоже, это тоже указывает.

Хотелось бы, чтобы у меня был лучший ответ, но так как я 'Используя svcutil из MSBuild, я решил позволить svcutil сгенерировать класс с неправильным ConfigurationName, а затем использовать задачу FileUpdate, чтобы изменить это имя с помощью регулярных выражений.Опять же, это далеко от идеала, но я не вижу ничего в документации svcutil, которая позволяет вам указывать имя_конфигурации.

Также стоит упомянуть, что опция serviceName используется для экспорта метаданных из скомпилированного кода, этонедопустимо для создания прокси-классов клиента, поэтому, вероятно, вы получили сообщение об ошибке конфликта параметров serviceName.

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

2 голосов
/ 03 сентября 2013

Не прямой ответ на вопрос, но причина, по которой изменение пространства имен не работает для вас, заключается в том, что вы, вероятно, забыли обновить ссылку контракта конфигурации на эту службу.

В вашем приложении / веб-конфигурации найдите

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

Посмотрите на атрибут contract. Если вы не указали пространство имен в svcutil, оно сгенерировало MyServiceName, а в web.config вы указали имя своей службы, указав только имя интерфейса. Теперь ваш интерфейс находится внутри пространства имен, поэтому вам нужно изменить конфигурацию следующим образом:

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

Короче говоря, свойство ConfigurationName в атрибуте должно соответствовать пространству имен и имени класса в атрибуте contract вашего файла config. Это ключ , с помощью которого он находит соответствующую конфигурацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...