Что означает эта ошибка WCF: «Предупреждение настраиваемого инструмента: невозможно импортировать wsdl: portType»


85

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

Все работало нормально - пока я не захотел обновить свои ссылки на сервисы. Это не удалось, поэтому я в конце концов откатился и попытался повторить попытку, но даже тогда это не удалось! Итак, обновление ссылок на службы не выполняется без внесения в них каких-либо изменений. Почему?!

Я получаю такую ​​ошибку:

Custom tool error: Failed to generate code for the service reference 
'MyServiceReference'.  Please check other error and warning messages for details.   

Предупреждение дает дополнительную информацию:

Custom tool warning: Cannot import wsdl:portType
Detail: An exception was thrown while running a WSDL import extension: 
System.ServiceModel.Description.DataContractSerializerMessageContractImporter
Error: List of referenced types contains more than one type with data contract name 'Patient' in  
namespace 'http://schemas.datacontract.org/2004/07/MyApp.Model'. Need to exclude all but one of the 
following types. Only matching types can be valid references: 
"MyApp.Dashboard.MyServiceReference.Patient, Medski.Dashboard, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" (matching)
"MyApp.Model.Patient, MyApp.Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" (matching)
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:portType[@name='ISomeService']

Есть еще два похожих предупреждения:

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://tempuri.org/']/wsdl:portType[@name='ISomeService']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:binding[@name='WSHttpBinding_ISomeService']  

И то же самое для:

Custom tool warning: Cannot import wsdl:port .. 

Я нахожу это все запутанным ... У меня нет класса пациентов на панели инструментов на стороне клиента, кроме того, который я получил через ссылку на службу. Так что это значит? И почему это вдруг проявляется? Помните: я даже ничего не менял!

Решение этой проблемы было найдено здесь , но без объяснения того, что это означает. Так; в разделе «Настроить ссылку на службу» снимаю флажок «Повторное использование типов в сборках, на которые есть ссылки». Пересборка теперь все работает нормально без проблем. Но что я действительно изменил? Повлияет ли это на мою заявку? А когда снимать галочку? Я хочу повторно использовать типы, для которых настроил DataContract, но не более того. Смогу ли я получить доступ к тем без этой отметки?


Хорошо, есть краткое объяснение по msdn ( msdn.microsoft.com/en-us/library/bb628653.aspx ). Но есть ли у кого-нибудь лучшее объяснение? Как это относится к настроенному мной контракту данных?
stiank81

Ответы:


37

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

  • Типы хранятся в dll, и на эту dll ссылаются как клиентское, так и серверное приложение.
  • Типы не находятся в DLL, на которую ссылается клиент. В этом случае инструмент, создающий ссылку на службу, создаст типы в файле links.cs.

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

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


2
Благодаря! Я действительно вчера нашел этот скринкаст. Посмотрел это, и это действительно открыло глаза! Я планирую переехать в эту структуру, как только разберусь с основами. Похоже, вы боретесь с некоторыми из тех же проблем, что и я. Я слишком часто удаляю и читаю ссылки на службы, когда что-то странно идет не так, и это плохой знак ... Надеюсь, что описанная архитектура поможет!
stiank81

Кто-нибудь смог написать веб-службу вручную, когда вы используете привязку PollingDuplex с Silverlight 5?
Ричард Би

157

Я нашел свой ответ здесь: http://www.lukepuplett.com/2010/07/note-to-self-don-let-wcf-svcutil-reuse.html

Короче говоря: я снял флажок «Типы повторного использования в эталонных сборках» в меню «Дополнительно» .


Не знаю, имеет ли это значение, но я использую не MVC, а веб-формы.


2
Также требуется перезапуск VS 2012
Джордж Филиппакос

Интересно посмотреть, но ссылка теперь мертва, поделитесь, пожалуйста, если она у вас есть в другом месте
Крис

1
Работает в проекте MVC 3 под VS2013 (перезапуск не требуется).
Павел Краковяк,

5
+1 - Для справки: чтобы внести это изменение, щелкните правой кнопкой мыши ссылку на службу в проекте, который ее использует, и выберите «Настроить ссылку на службу ...»
GrandMasterFlush

2
Нет ничего лучше, чем "короче" :)
Рон

10

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

Мой класс, который не удалось импортировать, имеет свойство типа перечисления cutom. Это свойство помечено как DataMember, а Enum также помечено как DataContract. Пока все хорошо. Я просто забыл отметить каждого члена enum как EnumMember.

Итак, я изменил

[DataContract]
public enum SortMethodType
{
    Default = 0,
    Popularity = 1,
    ReleaseDate = 2,
    PublishedDate = 3,
    TranslatedTitle = 4,
    OriginalTitle = 5,
    UserRating = 6,
    Duration = 7
}

К этому:

[DataContract]
public enum SortMethodType
{
    [EnumMember]
    Default = 0,
    [EnumMember]
    Popularity = 1,
    [EnumMember]
    ReleaseDate = 2,
    [EnumMember]
    PublishedDate = 3,
    [EnumMember]
    TranslatedTitle = 4,
    [EnumMember]
    OriginalTitle = 5,
    [EnumMember]
    UserRating = 6,
    [EnumMember]
    Duration = 7
}

И это наконец сработало!


8

Перейдите в Дополнительные свойства при добавлении ссылки и удалите "System.Window.Browser" из контрольного списка. Это решает проблему.


Спасибо! Больше не использовать ссылки на службы - использовать ручной подход, описанный в скринкасте из ответа @Shiraz. Но это все равно приятно знать!
stiank81

8

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

Я думаю, что нужно было перезапустить специальный инструмент или что-то в этом роде.


2
даже если вы полны решимости решить проблему БЕЗ удаления ссылки, я настоятельно рекомендую вам создать НОВЫЙ ПРОЕКТ и добавить ссылку, чтобы посмотреть, работает ли он. это может выявить ошибку, которую вы не видите в существующем проекте, или это может просто работать
Simon_Weaver

4

Я постоянно сталкиваюсь с этой ошибкой, пока она работает на другой машине разработчиков. Несмотря на то, что я являюсь полным администратором на всей своей виртуальной машине, я попытался закрыть Visual Studio и снова открыть с помощью «Запуск от имени администратора», и это волшебным образом сработало.

Удачи.


2

Я получил предупреждение после обновления своего решения с Visual Studio (VS) 2010 до 2013 года и изменения .NET Framework каждого проекта с 4 на 4.5.1. Я закрыл VS и снова открыл, и предупреждения исчезли.


Это помогло мне, но я перешел с .NET 4.5.2 на 4.6 Gaa!
Jimenemex

1

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

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

Надеюсь, это поможет кому-то другому.


0

Мои интерфейсы службы WCF находятся в сборке, реализация - в другой, а ссылка на службу - в еще одной сборке, отдельной от клиентов ссылки службы. Я получил сообщение об ошибке сразу после того, как применил DataContract к перечислению. После того как я применил EnumMember к полям перечисления, проблема разрешилась.


0

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

Я использую Silverlight 5 и несколько раз пытался удалить и воссоздать ссылку. Вreference.cs раз файл оказывался совершенно пустым, и с тех пор, как я его создал, прошли буквально годы, поэтому попытка выяснить, что изменилось в службе, не могла быть и речи.

Обратил внимание, что в ошибке есть ссылки на 2.0.5.0. Сейчас я даже не знаю, действительно ли это относится к версии Silverlight, но это заставило меня подумать о том, чтобы просто создать новый проект, и вдруг все заработало.

Предупреждение 2 Предупреждение настраиваемого инструмента: Невозможно импортировать wsdl: portType Подробно: исключение было создано при запуске расширения импорта WSDL: System.ServiceModel.Description.DataContractSerializerMessageContractImporter Ошибка: не удалось загрузить файл или сборку System.Xml, версия = 2.0.5.0, Культура = нейтральный, PublicKeyToken = 7cec85d7bea7798e 'или одна из его зависимостей. Система не может найти указанный файл. XPath к источнику ошибки: // wsdl: definitions [@targetNamespace = ''] / wsdl: port Type [@ name = 'IShoppingCart']


0

Я просматривал свой проект, и у меня была такая же проблема. Оказалось, что это разные версии одной и той же библиотеки DLL на веб-сайте WCF. На веб-сайте была более новая версия DLL, а служба ссылалась на более старую версию DLL. Как только они все были синхронизированы, все работало хорошо.


0

Я испытал ту же ошибку. Я боролся почти день, пытаясь выяснить, что пошло не так. Ключом к разгадке для меня были предупреждения, которые бросал VS. Он пытался выполнить какое-то сопоставление с Yahoo.Yui.Compressor.dll, библиотекой, которую я добавил и удалил (потому что решил не использовать ее) пару дней назад. Это было шокирующим, потому что библиотеки не было, но каким-то образом она пыталась сослаться на нее.

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


0

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

У меня есть две службы WCF и два клиентских приложения, которые общаются через ссылки на службы. Я обновил пакет nuget с обеих сторон и попытался обновить ссылку на службу и получил эту ошибку.

Удаление не помогло. Снимать галочку с «повторного использования сборок» нежелательно, так как мне нужно их повторно использовать - в этом весь смысл.

В конце концов, возникли две отдельные проблемы:

1) Первой проблемой, как мне кажется, была проблема с кешированием в Visual Studio. Я тщательно просмотрел все ссылки и не обнаружил никаких проблем, но он все равно сообщил, что не могу найти предыдущую версию файла. Я удалил все пакеты nuget, перезапустил Visual Studio и переустановил их. Обновление ссылки на сервис сработало.

2) Вторая проблема была вызвана проблемой зависимости. Я обновил пакет nuget с обеих сторон, и все выглядело правильно, но неотмеченная зависимость не была синхронизирована. Пример:

Пакет Foo v1 ссылается на Bar v1. Можно независимо обновить Foo и Bar до v2 без обновления ссылки. Если вы устанавливаете и Foo, и Bar v2, инструмент справки по сервису просканирует Foo v2, см. Ссылку на Bar v1 и завершится ошибкой, потому что не сможет найти старую версию. Об этом сообщается правильно только в том случае, если вы обновляете номера версий своей dll для каждого пакета. Visual Studio и MSBuild не будут иметь проблем со сборкой приложения, но справке по службе будет ужасно сложно все решить.

Я надеюсь, что это поможет кому-то.

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