Что означает эта ошибка WCF: "Предупреждение пользовательского инструмента: невозможно импортировать wsdl:portType"
Я создал проект библиотеки сервисов 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 ..
Я нахожу это все сбивающим с толку.. У меня нет класса Patient на клиентской панели, кроме того, который я получил через сервисную справку. Так что это значит? И почему это вдруг показывает? Помните: я даже ничего не менял!
Теперь решение было найдено здесь, но без объяснения того, что это значит. Так; в "Настроить ссылку на службу" для службы я снимаю флажок "Повторное использование типов в ссылочных сборках". Восстановление сейчас все работает нормально без проблем. Но что я действительно изменил? Повлияет ли это на мое приложение? И когда это нужно снять? Я хочу повторно использовать типы, для которых я установил DataContract, но не более того. Я все еще получу доступ к тем без этого проверенного?
13 ответов
Когда вы добавляете ссылку на службу, существует два способа обработки типов, используемых службой:
- Типы хранятся в DLL, и на эту DLL ссылаются как клиентское, так и серверное приложение.
- Типы не находятся в DLL, на которые ссылается клиент. В этом случае инструмент, который создает ссылку на службу, создаст типы в файле reference.cs.
Есть много вещей, которые могут пойти не так. Мы обнаружили, что в случае сбоя инструмента иногда быстрее удалить ссылку на сервис и запустить снова.
Мы перестали использовать сервисную ссылку. Для проектов, в которых у нас есть контроль над клиентом и сервисом, мы используем метод, описанный в этом скриншоте.
Я нашел свой ответ здесь: http://www.lukepuplett.com/2010/07/note-to-self-don-let-wcf-svcutil-reuse.html
Короче говоря: я снял флажок "Повторное использование типов в ссылочных сборках" в меню "Дополнительно".
Я не знаю, имеет ли это значение, но я использую не MVC, а веб-формы.
У меня тоже была эта проблема сегодня. Мне понадобился целый день, чтобы найти свою ошибку. Надеюсь, поможет.
Мой класс, который не удалось импортировать, имеет свойство типа cutum enum. Это свойство помечается как 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
}
И это наконец-то сработало!
Перейти к расширенным свойствам при добавлении ссылки и удалить "System.Window.Browser" из контрольного списка, это решает проблему.
Это может звучать странно, но я исправил это, удалив ссылки, затем закрыл Visual Studio, снова открыл его и, наконец, снова добавил ссылки.
Я думаю, что пользовательский инструмент нужно было перезапустить или что-то в этом роде.
Я постоянно сталкиваюсь с этой ошибкой, пока она работает на другой машине разработчиков. Несмотря на то, что я являюсь полным администратором повсюду на своей виртуальной машине, я пытался закрыть Visual Studio и снова открыть с помощью "Запуск от имени администратора", и это волшебным образом сработало.
Удачи.
Я получил предупреждение после обновления моего решения с Visual Studio (VS) 2010 до 2013 и изменения.NET Framework каждого проекта с 4 на 4.5.1. Я закрыл VS и снова открыл, и предупреждения ушли.
Недостатком отключения "повторного использования типов в ссылочных сборках" является то, что это может вызвать проблемы с неоднозначными ссылками. Это связано с тем, что ссылка на службу снова создает эти объекты в ссылочном файле.cs, и ваш код, реализующий службу, может ссылаться на них из исходного пространства имен.
Когда возникает такой сценарий, я считаю полезным проверить "типы повторного использования в указанных сборках, на которые имеются ссылки", что позволяет мне выбирать только те, у которых есть неоднозначные ссылки, что быстро решает проблему таким образом.
Надеюсь, это поможет кому-то еще.
Для всех, кто был здесь в будущем, у меня была та же ошибка, но вызванная проблемами с версией, двумя разными способами.
У меня есть две службы WCF и два клиентских приложения, которые общаются через ссылки на службы. Я обновил пакет nuget с обеих сторон, попытался обновить ссылку на сервис и получил эту ошибку.
Удаление не помогло. Снятие отметки "повторное использование сборок" нежелательно, так как мне нужно повторно использовать их - вот и весь смысл.
В итоге возникли два отдельных вопроса:
1) Первой проблемой, на мой взгляд, была проблема кэширования в визуальной студии. Я тщательно просмотрел все ссылки и не нашел проблем, но он все еще сообщил, что не может найти предыдущую версию файла. Я удалил все пакеты nuget, перезапустил Visual Studio и переустановил их. Обновление сервисной справки сработало.
2) Вторая проблема была вызвана проблемой зависимости. Я обновил пакет nuget с обеих сторон, и все выглядело правильно, но неопознанная зависимость была не синхронизирована. Пример:
Пакет ссылок Foo v1 Bar v1. Можно обновить Foo и Bar до v2 независимо, не обновляя ссылку. Если вы устанавливаете Foo и Bar v2, сервисный справочник отсканирует Foo v2, увидит ссылку на Bar v1 и потерпит неудачу, поскольку не может найти более старую версию. Это сообщается правильно, только если вы обновляете номера версий вашей dll для каждого пакета. Visual Studio и MSBuild не будут иметь проблем со сборкой приложения, но справочная служба будет ужасно долго пытаться решить все проблемы.
Я надеюсь, что это помогает кому-то.
Я просматривал свой проект, и у меня возникла та же проблема. Оказалось, что разные версии одной и той же DLL на WCF и веб-сайте. На веб-сайте была более новая версия DLL, и служба ссылалась на более старую версию DLL. Как только они все были синхронизированы, все работало хорошо.
Если вы сомневаетесь в том, что у вашего сервиса нет проблем (например, проблем с перечислениями или несериализуемыми классами, упомянутыми другими), попробуйте создать новый проект с новой ссылкой.
Я использую Silverlight 5 и несколько раз пытался удалить и восстановить ссылку. reference.cs
файл просто появлялся совершенно пустым каждый раз, и прошло уже несколько лет с тех пор, как я его создал, поэтому пытаться выяснить, что изменилось в сервисе, не могло быть и речи.
Я заметил, что ошибка содержала ссылки на 2.0.5.0. Теперь я даже не знаю, относится ли это на самом деле к версии Silverlight, но это заставило меня задуматься о создании нового проекта, и вдруг все заработало.
Предупреждение 2 Предупреждение настраиваемого инструмента: не удается импортировать wsdl:portType Подробно: возникла исключительная ситуация при выполнении расширения импорта WSDL: System.ServiceModel.Description.DataContractSerializerMessageContractImporter Ошибка: не удалось загрузить файл или сборку 'System.Xml, Version=2.0.5.0, Культура = нейтральная, PublicKeyToken=7cec85d7bea7798e'или одна из ее зависимостей. Система не может найти указанный файл. XPath to Error Источник: //wsdl: определения [@targetNamespace='']/wsdl: тип порта [@name='IShoppingCart']
Я испытал ту же ошибку. Я боролся почти сутки, пытаясь выяснить, что происходит не так. Ключом для меня были предупреждения, которые бросал В.С. Он пытался сделать какое-то сопоставление с Yahoo.Yui.Compressor.dll, библиотекой, которую я добавил и удалил (потому что я решил не использовать ее) пару дней назад. Это было шокирующим, потому что библиотеки там не было, но каким-то образом она пыталась сослаться на нее.
Наконец, я восстанавливаю эту DLL из корзины, и затем я могу успешно обновить ссылку на службу.
Мои интерфейсы службы WCF находятся в сборке, реализация - в другой, а ссылка на службу - в другой сборке, отдельно от клиентов ссылки на службу. Я получил сообщение об ошибке сразу после того, как применил DataContract к перечислению. После того, как я применил EnumMember к полям перечисления, проблема разрешилась.