Сервисная ссылка не генерирует типы клиентов - PullRequest
25 голосов
/ 08 июня 2010

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

например. Конечная точка имеет 2 службы - ISvc1 и ISvc2. Когда я добавляю ссылку на службу к этой конечной точке в библиотеке первого класса, я получаю ISvc1Client и ISvc2Client для генерации прокси-серверов, чтобы использовать операции, предоставляемые этими двумя контрактами. В дополнение к этим клиентам сервисная ссылка также предоставляет типы, включенные в такие операции, как (тип 1, тип 2 и т. Д.), Это то, что мне нужно. Однако, когда я пытаюсь добавить ссылку на службу к той же конечной точке в другом консольном приложении или библиотеке классов, отображаются только Тип 1, Тип 2 и т. Д., А не ISvc1Client и ISvc2Client, из-за которых я не могу сгенерировать прокси для доступа к нужным мне операциям. Я не могу определить, почему ссылка на службу генерируется правильно в одной библиотеке классов, а не в другой или в приложении консоли тестирования.

Ответы [ 7 ]

44 голосов
/ 04 марта 2014

Возможно, вы выбрали Reuse types in specified reference assemblies, но не выбрали очень важную библиотеку mscorlib.

Сначала нажмите «Показать все файлы» в верхней части обозревателя решений, чтобы развернуть ссылку на службу.

enter image description here

  • Найдите файл Reference.cs и откройте его.
  • Найдите ClientBase в исходном коде, чтобы убедиться, что у вас действительно нетСгенерировал клиента с именем, которого вы не ожидали.Если вы найдете его, то это имя вашего сервисного клиента.

enter image description here

Если ничего не найдено, щелкните правой кнопкой мыши ссылку на сервис и выберите Configure Service Reference.

Важным является mscorlib, который необходим для правильной генерации клиента.Мне нравится выбирать System.Xml.Linq также, чтобы получать классы Linq, такие как XElement, а не XmlElement.

enter image description here


Все еще застряли?

  • Совет: я всегда предпочитаю создавать выделенную DLL только для справки службы.Это может помочь, если вам нужно стереть его и начать все сначала, и это позволяет избежать определенных проблем компиляции из курицы и яйца время от времени.

  • Если у вас получится половина ссылокВ файле .cs вы, возможно, «повторно используете ссылочный тип», который не совместим с вашим контрактом на данные.то есть вы добавили элементы данных на стороне сервера или изменили подпись существующего элемента, например, добавив необязательный тип значения.

  • Во-первых, поймите, что SVCUTIL с удовольствием сгенерирует неполный выходной файл, даже если у него будут проблемы, и при запуске из Visual Studio вы не получите файл журнала.Следите за ожидаемым размером в Explorer и сравните его с вашим последним известным размером.

  • Попробуйте запустить SVCUTIL.EXE напрямую из командного файла (не забудьте сохранить этот файлв следующий раз)

  • Это проще всего сделать в командной строке Visual Studio

  • Пример команды следующий, обратите внимание на referenceпараметр библиотеки DLL, из которой вы ссылаетесь на типы.

    svcutil.exe http://dev.example.com/SSWPF.Web/Services/SS.svc /reference:bin\debug\RRStore.Sys.DLL

Detail: An exception was thrown while running a WSDL import extension:

System.ServiceModel.Description.DataContractSerializerMessageContractImporter Ошибка: ссылочный тип 'SS.Sys.ShippingRateInfo, RRStore.Sys, версия = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null' с именем контракта данных 'ShippingRateInfo' вПространство имен 'http://schemas.datacontract.org/2004/07/SS.Sys' нельзя использовать, поскольку оно не соответствует импортированному DataContract.Необходимо исключить этот тип из ссылочных типов.XPath to Error Источник: // wsdl: Definitions [@targetNamespace = 'http://tempuri.org/']/wsdl:portType[@name='ISSWCF']

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

8 голосов
/ 30 августа 2010

Реальный ответ: если вы сериализуете тип с использованием KnownTypeAttribute в контракте на обслуживание, вы ДОЛЖНЫ включить ссылку на библиотеку вашего типа в проект, к которому вы добавляете ссылку на службу.

Например, если ваша служба wcf сериализует тип System.Drawing.Image, то потребительский проект ДОЛЖЕН иметь ссылку на System.Drawing. Надеюсь, что это поможет некоторым людям там.

2 голосов
/ 18 марта 2016

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

Версия 1 Контракт

[DataContract(Namespace="http://www.exmample.com/v1")]
public enum Fruits
{
    [EnumMember]
    Apple,
    [EnumMember]
    Orange
}

Версия 2 Контракт

[DataContract(Namespace="http://www.exmample.com/v1")]
 public enum Fruits
 {
    [EnumMember]
    Apple,
    [EnumMember]
    Orange,
    [EnumMember]
    Mango
 }

Я решил эту проблему с помощью svcutil утилита командной строки.Команда

svcutil MyContract.dll

Я получил следующее сообщение об ошибке

DataContract for type 'V2.Fruits' cannot be added to DataContractSet since type 'V1.Fruits with the same data contract name 'Fruits' in namespace 'http://www.exmample.com/v1' is already present and the contracts are not equivalent.

Я изменил пространство имен с версии 1 на версию 2 и смог создать ссылку на службу в тестовом проекте.

[DataContract(Namespace="http://www.exmample.com/v2")]
 public enum Fruits
 {
    [EnumMember]
    Apple,
    [EnumMember]
    Orange,
    [EnumMember]
    Mango
 }

Используйте svcutil , это поможет решить эту проблему.

2 голосов
/ 28 июля 2015

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

1 голос
/ 06 июля 2012

Обычно это происходит для добавления ссылки на услугу, которую вы добавили ранее.В конфигурации клиента он все еще имеет соответствующую сервисную модель.Убедитесь, что вы удалили сервисную модель из конфигурации клиента, а затем попробуйте снова добавить сервисную ссылку снова!

0 голосов
/ 20 ноября 2017

В продолжение ответа @ Kevin, я добавил ссылки на все проекты и библиотеки DLL, на которые есть ссылки в сервисном проекте. Генерация прокси смогла затем распознать / сгенерировать требуемые типы.

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

0 голосов
/ 08 июня 2010

Очевидно, что вы должны добавить ссылку на System.Web в свой проект, прежде чем добавлять ссылку на службу. Это сделал это.

...