Помилка посилання на сервіс: Не вдалося створити код для посилання на службу


131

У мене є Рішення служби Windows і я намагаюся додати посилання на сервіс веб-служби Hermes (Opensource сервер повідомлень 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, замість того, щоб сліпо використовувати всі посилаються. Це може бути складніше і витрачати більше часу, ніж знімати прапорці, про які йдеться, але я вважаю це рішення більш підходящим, ніж одне позначені як відповідь.
Оскар

Також переконайтеся, що ваш проект не читається лише. Це була моя проблема ..
аріхатень,

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 у файл конфігурації проекту запуску.

Якщо існують типи, визначені в локальних зборах, які потрібно повторно використовувати в сервісному клієнті, на ці збори просто потрібно посилатися з вищезазначеного проекту бібліотеки класів разом з усіма їх залежностями.


Дивно. Я змінив прив’язку з HttpBinding на NetNamedPipeBinding (також додав кінцеву точку mex) і сприяв цьому в моїй клієнтській збірці А. Я створив нову бібліотеку класу B, яка посилалася на мою службу WCF. Потім я додав B як посилання на A і магічно все працює знову. Дуже дивно. Дякую за рішення
citronas

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/'). Я знаю про проблеми та інше поводження зі схемою, коли інструкції щодо включення ігноруються.

Як правило, я вважаю, що впровадження веб-сервісів Майкрософт досить добре, тому я думаю, що веб-сервіс повертає туманні 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

Якщо ви хочете виправити це, не знімаючи прапорець для повторного використання збірки, це для мене спрацювало:

  • Видаліть посилання, яке ви хочете повторно використовувати
  • Видаліть всю папку бін проекту
  • Оновити довідку служби
    • Зберігайте "Типи повторного використання в зазначених посиланнях"
  • Додайте посилання на збірку знову, щоб виправити помилки
  • Оновіть довідку служби знову


-1

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

Для мене працювало таке:

  • Видаліть посилання, яке я хотів повторно використати
  • Оновити довідку служби
  • Зберігайте "Типи повторного використання в зазначених посиланнях"
  • Ігноруйте помилки, це тому, що посилання відсутня!
  • Додайте посилання на збірку знову, щоб виправити помилки
  • Оновіть довідку служби знову

Voila, тепер він фактично оновлюється і більше не намагається видалити весь мій створений код.

Я майже був готовий відмовитися від функції повторного використання ...

Редагувати: Також переконайтеся, що конфігурація збірки є AnyCPU або x86, оскільки svcutil є помилкою з x64.

Керівнику: Вибачте, якщо це не працювало для вас, я навіть не знаю, чому це працювало для мене, але це було. Я, можливо, зробив щось інше того часу, що вирішило проблему, але зараз не знати про це.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.