Ошибка ссылки на службу: не удалось сгенерировать код для ссылки на службу


131

У меня есть решение для службы Windows, и я пытаюсь добавить ссылку на веб-службу Hermes (сервер сообщений ebms с открытым исходным кодом) в VS2010.

Я могу найти веб-службу, используя ее URL-адрес, но когда я пытаюсь заполнить ссылку на службу, я получаю следующие ошибки в Visual Studio:

Error 8 Custom tool error: Failed to generate code for the service reference 'testService'.  Please check other error and warning messages for details. C:\Users\Admin\documents\visual studio 2010\Projects\MyProject\MyProject.MessageHandler\Service References\testService\Reference.svcmap 1 1 MyProject.MessageHandler


Warning 6 Custom tool warning: Cannot import wsdl:binding
Detail: There was an error importing a wsdl:portType that the wsdl:binding is dependent on.
XPath to wsdl:portType: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:portType[@name='EbmsStatusQuery']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:binding[@name='EbmsSoapHttpStatusQuery'] C:\Users\Admin\documents\visual studio 2010\Projects\MyProject\MyProject.MessageHandler\Service References\testService\Reference.svcmap 1 1 MyProject.MessageHandler

Warning 7 Custom tool warning: Cannot import wsdl:port
Detail: There was an error importing a wsdl:binding that the wsdl:port is dependent on.
XPath to wsdl:binding: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:binding[@name='EbmsSoapHttpStatusQuery']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:service[@name='EbmsMessageStatusQuery']/wsdl:port[@name='EbmsStatusQuery'] C:\Users\Admin\documents\visual studio 2010\Projects\MyProject\MyProject.MessageHandler\Service References\testService\Reference.svcmap 1 1 MyProject.MessageHandler

Warning 5 Custom tool warning: Cannot import wsdl:portType
Detail: An exception was thrown while running a WSDL import extension: System.ServiceModel.Description.XmlSerializerMessageContractImporter
Error: Schema with target namespace 'http://service.ebms.edi.cecid.hku.hk/' could not be found.
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:portType[@name='EbmsStatusQuery'] C:\Users\Admin\documents\visual studio 2010\Projects\MyProject\MyProject.MessageHandler\Service References\testService\Reference.svcmap 1 1 MyProject.MessageHandler

Некоторое исследование показало, что это связано с тем, что svcutil.exe не смог создать прокси из-за отсутствия разрешений на каталог (возможно, c: \ windows \ temp). Я пробовал назначать различные разрешения доступа, но я не совсем уверен, кому из пользователей требуется разрешение, или это просто отвлекающий маневр.

Любые идеи очень приветствуются.

Спасибо

Ответы:


303

Необходимо снять флажок Типы повторного использования во всех сборках, на которые есть ссылки, в параметре Настроить ссылку на службу.

Проверьте это для подробностей


3
В качестве альтернативы, когда действительно требуется «Повторное использование типов в ссылочных сборках», вы можете добавить ссылку на службу из проекта библиотеки классов, специально созданного для этой цели. Проверьте мой ответ для получения дополнительной информации.
Флорин Думитреску

Мне нужно было решение без снятия флажка «Типы повторного использования», и мне удалось найти тот, который работал, см. Мой ответ здесь .
Шахин

Вместо того, чтобы делать что-то подобное, используйте сборки, от которых зависит клиент WCF, вместо того, чтобы вслепую использовать все ссылочные. Это может быть сложно и требует больше времени, чем снятие флажка, о котором идет речь, но я считаю это решение более подходящим, чем тот отмечен как ответ.
Оскар Гийамон 01

Также убедитесь, что ваш проект не доступен только для чтения ... Это была моя проблема ...
arihanth jain

126

Щелкните правой кнопкой мыши ссылку на службу и выберите Configure Service Reference...

Настроить ссылку на службу

Затем снимите флажок Reuse types in referenced assemblies

Типы повторного использования

Щелкните OK, очистите и перестройте свое решение.


2
Что, если мне нужно повторно использовать сборки, на которые есть ссылки? У меня есть проект, и этот флажок установлен. Обновление работает на моей машине, но на машине напарника нет ... никаких подсказок?
Рикардо Эпплтон,

Это произошло, когда я обновил свой проект с v4.6.1 до v4.7. Это исправило это.
Майк Флинн

17

Я также столкнулся с аналогичной ошибкой при попытке сгенерировать клиента для веб-службы из проекта ASP .Net MVC 4.0 с помощью Visual Studio 2012.

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

Когда в конфигурации службы включен параметр «Повторное использование типов в сборках, на которые имеются ссылки», генератор службы, вероятно, проверяет все сборки, на которые имеются ссылки, чтобы получить список типов, которые можно использовать повторно. Тот факт, что одна из указанных сборок ссылается на другую сборку, которая недоступна, вероятно, вызывает сбой генератора.

Снятие флажка «Повторное использование типов в ссылочных сборках» в конфигурациях службы решит указанную выше проблему , но имеет побочный эффект. Параметр повторного использования типов существует не просто так, и в некоторых случаях он позволяет избежать ненужного приведения в коде, потребляющем службу.

Например, если сама служба построена с использованием WCF и некоторые параметры методов внутри нее имеют тип System.Guid, они будут преобразованы в строки в созданном клиенте, если параметр типов повторного использования отключен.

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

Если в локальных сборках определены типы, которые необходимо повторно использовать в клиенте службы, на эти сборки просто нужно ссылаться из вышеупомянутого проекта библиотеки классов вместе со всеми их зависимостями.


Weird. Я изменил привязку с HttpBinding на NetNamedPipeBinding (также добавил конечную точку mex) и использовал это в своей клиентской сборке A. Я создал новую библиотеку классов B, которая ссылалась на мою службу WCF. Затем я добавил B как ссылку на A, и волшебным образом все снова заработало. Очень странно. Спасибо за решение
citronas 02

3

http://uliasz.com/2011/06/wcf-custom-tool-error-failed-to-generate-code-for-the-service-reference/#comment-1647

Благодаря статье выше.

В моем случае у меня есть эта проблема с моим проектом WPF в VS.Net 2008. После прочтения этой статьи я понял, что сборка, используемая в веб-службе, является другой версией сборки, используемой на клиенте.

Он отлично работает после обновления сборки на клиенте.


1

Было бы чрезвычайно сложно угадать проблему, поскольку она вызвана ошибкой в ​​WSDL, и без изучения WSDL я не могу больше комментировать. Так что, если вы можете поделиться своим WSDL, сделайте это.

Все, что я могу сказать, это то, что, похоже, в WSDL отсутствует схема (с целевым пространством имен 'http://service.ebms.edi.cecid.hku.hk/'). Я знаю о проблемах и различном обращении со схемой, когда инструкции включения игнорируются.

В общем, я считаю, что реализация веб-сервисов Microsoft довольно хороша, поэтому я думаю, что веб-сервис отправляет хитроумный WSDL.


Спасибо, Aliostad, я постараюсь поделиться WSDL, когда вернусь с работы.
jheppinstall

0

Я получаю ту же ошибку в Silverlight 5 (VS2012)

Вы также можете удалить ссылки на:

  • System.ServiceModel.DomainServices.Client
  • System.ServiceModel.DomainServices.Client.Web

После обновления ссылок на службы не забудьте добавить их обратно.


0

Как указано выше, возможны несколько различных проблем. Мы обнаружили, что .DLL для библиотеки WCF был добавлен в качестве ссылки на клиентский проект. Это, в свою очередь, создавало проблемы с разрешением объектов и, таким образом, приводило к «опустошению» файлов на этапах генерации кода. Хотя снятие отметки с использования «Типы повторного использования ...» может показаться ответом, он создает дополнительные определения типов объектов, которые являются прокси к реальным типам, в новом пространстве имен, что затем вызывает всевозможные проблемы «совместимости» с использование этих типов. Только если вы действительно хотите «скрыть» тип, вы должны отметить эту опцию.

Скрытие типа было бы целесообразно, если вы не хотите, чтобы зависимость типа «DLL» «просачивалась» в проект, который вы пытаетесь отделить от другого. Если DLL для проекта библиотеки WCF проникает в ссылки клиентского проекта, у вас будет эта проблема со всеми видами странных побочных эффектов, поскольку определения типов также находятся в DLL.


0

столкнуться с той же проблемой, решенной путем запуска Visual Studio в режиме администратора


0

Я столкнулся с этой проблемой при обновлении решения VS2010 WCF + Silverlight в VS2015 Professional . Помимо автоматического обновления Silverlight 4 до Silverlight 5, было изменено значение флажка повторного использования ссылки на службу, и создание не удалось.


0

«Типы повторного использования» не всегда являются проблемой при возникновении этой ошибки.

При добавлении ссылки на более старую службу щелкните «Дополнительно» и выберите «Добавить веб-ссылку». Теперь сделайте ссылку на ваш wsdl, и все должно работать.


0

Если вы хотите исправить это, не снимая флажок повторного использования сборки, у меня сработало следующее:

  • Удалите ссылочную сборку, которую вы хотите использовать повторно
  • Удалить всю папку bin проекта
  • Ссылка на службу обновления
    • Сохраните "Повторное использование типов в указанных сборках, на которые есть ссылки"
  • Снова добавьте ссылку на сборку, чтобы исправить ошибки
  • Обновите ссылку на сервис еще раз


-1

У меня возникла эта проблема при попытке обновить ссылку на мою службу (ошибка появляется только при добавлении ссылки на службу), но я не хотел снимать флажок повторного использования сборки.

То, что работало для меня, было следующим:

  • Удалить указанную сборку, которую я хотел использовать повторно
  • Ссылка на службу обновления
  • Сохраните "Повторное использование типов в указанных сборках, на которые есть ссылки"
  • Не обращайте внимания на ошибки, потому что ссылка отсутствует!
  • Снова добавьте ссылку на сборку, чтобы исправить ошибки
  • Обновите ссылку на сервис еще раз

Вуаля, теперь он действительно обновляется и больше не пытается удалить весь мой сгенерированный код.

Я был почти готов отказаться от функции повторного использования типов ...

РЕДАКТИРОВАТЬ: также убедитесь, что конфигурация сборки - AnyCPU или x86, поскольку svcutil ошибается с x64.

Голосующему против: извините, если это не сработало для вас, я даже не знаю, почему это сработало для меня, но это сработало. Возможно, в тот раз я сделал что-то еще, что устранило проблему, но сейчас нет возможности узнать.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.