Что означает эта ошибка 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, но не более того. Смогу ли я получить доступ к тем, кто не прошел проверку?

Ответ 1

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

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

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

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

Ответ 2

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

Короче говоря: я не отмечен Типы повторного использования в ссылочных сборках из Расширенного меню.


Я не знаю, если это имеет значение, но я не использую MVC, а Web Forms.

Ответ 3

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

Мой класс, который не мог быть импортирован, имеет свойство типа перечисления cutom. Это свойство помечено как DataMember, а Enum также помечено как DataContract. Пока все хорошо. Я просто забыл отметить каждого члена перечисления как 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
}

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

Удачи.

Ответ 7

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

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

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

Ответ 8

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

Ответ 9

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

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

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

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

Ответ 10

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

Ответ 11

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

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

Ответ 12

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

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

Удаление не помогло. Отмена "повторных сборок" нежелательна, так как мне нужно их повторно использовать, - что все дело.

В конце было два отдельных вопроса:

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

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

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

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

Ответ 13

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