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