Подтвердить что ты не робот

Ссылка на службу не генерирует типы клиентов

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

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

4b9b3361

Ответ 1

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

Ответ 2

Возможно, вы выбрали 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 только для ссылки на службу. Это может помочь, если вам нужно вытереть его и начать заново, и это позволяет избежать некоторых проблем компиляции курятины и яйца время от времени.

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

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

  • Попробуйте запустить 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, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null ' с именем контракта данных 'ShippingRateInfo' в пространстве имен 'http://schemas.datacontract.org/2004/07/SS.Sys' не может быть используется, поскольку он не соответствует импортированному DataContract. Необходимо исключить этот тип из ссылочных типов.     XPath to Error Источник://wsdl: определения [@targetNamespace = 'http://tempuri.org/']/wsdl: portType [@ name= 'ISSWCF "]

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

Версия 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, это поможет решить эту проблему.

Ответ 7

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

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