WCF распространенные типы не используются повторно - PullRequest
16 голосов
/ 27 ноября 2011

Подсказка: в этом вопросе много дубликатов, но ни одно из решений не работает для меня.

У меня есть веб-служба и клиент, оба из которых имеют ссылки на общую сборку "DataModel".Я создаю прокси службы с помощью диалога «Добавить ссылку на службу ...» и выбираю «Повторное использование типов во всех ссылочных сборках», но все же он создает новые типы вместо повторного использования моего.

  • Itраньше работал, но теперь вдруг больше не использует типы
  • Ссылка на общую сборку до добавление ссылки на службу не работает
  • Перезапуск VS2010 не помогает (у меня естьвсе обновления)
  • Я пытался с простым классом POCO (просто простой класс, содержащий целочисленное свойство), тоже не повезло
  • Удаление и повторное добавление ссылки на службу (или ссылки на общую сборку)) не помогло
  • Только выбор общей сборки в «Повторное использование типов в указанных сборках, на которые есть ссылки» - не повезло
  • svcutil.exe /reference дает тот же результат

IЯ в конце остроумия как-то.Есть ли другие решения?

РЕДАКТИРОВАТЬ: Я должен добавить, что я просто сбросил свой проект на более ранние коммиты, и какой бы коммит я ни использовал, все та же проблема.И я знаю, это работало с более ранними коммитами!

Ответы [ 6 ]

15 голосов
/ 28 ноября 2011

Ссылка на общую сборку перед добавлением ссылки на службу не работает

Вам нужно будет сделать это или хотя бы обновить сервисную ссылку после добавления ссылки.

Удаление и повторное добавление ссылки на службу (или ссылку на общую сборку) не помогло

и вам не нужно этого делать, но я бы тоже попробовал.

Чтобы «повторное использование» работало, оба проекта (клиента и службы) должны использовать одну и ту же версию сборки. Вы ссылаетесь на проект, и это хорошо - я сталкивался с этим раньше, когда ссылался на сборку напрямую из-за разных версий.

Вот еще несколько вещей, которые можно попробовать

  • Откройте «Диспетчер конфигурации» для своего решения - убедитесь, что общая сборка настроена на сборку.
  • Убедитесь, что вы используете ссылку на проект для клиентской службы и - использование последней сборки на клиенте не поможет, если служба использует более старую версию.
  • Удалите ссылку на проект и соберите, и ожидайте, что сборка не удастся - если она не сработает, то вы должны ссылаться на что-то еще.
  • Вручную убедитесь, что в сборку и службы и клиента включена последняя «общая сборка» - проверьте папку bin, проверьте версию / дату сборки.

Если все остальное терпит неудачу, лучший способ заставить один и тот же объект с обеих сторон - полностью удалить прокси-сервер «service reference» и использовать метод ChannelFactory. См. Более простое объяснение того, как сделать вызов WCF-службой без добавления службы. Ссылка и VS2010 Преимущества добавления справочной службы по прямой ClientBase <> . Это мой предпочтительный шаблон WCF, поскольку он устраняет необходимость «Обновить ссылку на службу ...» и удаляет весь созданный прокси-код.

11 голосов
/ 18 февраля 2014

Я просто целый день пытался выяснить, почему типы в моей общей dll не использовались повторно, когда я добавил ссылку на сервис в VS2013. Оказывается, у сервиса было несколько проблем, связанных с сериализацией. У меня была пара перечислений, у которых не было атрибута EnumMember. Я решил свои проблемы, попробовав следующие шаги:

  1. Закомментирование всех операций (методы, украшенные атрибутом OperationContract) в моем ServiceContract, которые не возвращали атомарные типы .
  2. Затем обновляет мою ссылку на службу в моем клиентском проекте. Я понял, что проблема была решена, когда в моем клиентском проекте я смог набрать «[MyServiceReferenceName]». и мои типы не отображаются в пространстве имен [MyServiceReferenceName]. Я подтвердил это, открыв сгенерированные файлы XSD в браузере схем XML, чтобы быть уверенным.
  3. Один за другим раскомментируйте метод , который был прокомментирован на шаге 1. Затем обновляет ссылку на сервис каждый раз, чтобы увидеть, возобновляются ли типы .
  4. Как только вы найдете метод, который приводит к тому, что ссылка на службу не сможет повторно использовать типы , перейдите к каждому классу для типов, которые либо вводятся, либо выводятся в метод. Убедитесь, что все классы , которые вы хотите сериализовать, имеют атрибут [DataContract]. Убедитесь, что все поля и свойства имеют атрибут [DataMember]. Кроме того, убедитесь, что перечисления украшены [DataContract] и что каждое значение перечисления украшено [EnumMember] .

Я надеюсь, что это поможет другим, которые проходят через этот разочаровывающий процесс, и эта проблема не обязательно связана с общей DLL. Моя проблема не была на самом деле проблема с использованием Add или Update Service Reference. Проблема заключалась в том, что мои классы сущностей (моделей) не были украшены надлежащими атрибутами, чтобы уведомить DataContractSerializer о сериализации этих типов. Похоже, что если какая-либо часть сериализации завершится неудачно, добавление ссылки на службу добавит все типы.

2 голосов
/ 22 августа 2012

OBJECTCEPTION!

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

Предложение (решение?): Убедитесь, что в библиотеках нет других объектов, объектов в этом объекте или ... и т. д. с тем же именем.как один к вашим услугам.

2 голосов
/ 27 ноября 2011

Это довольно далеко, но одна возможность состоит в том, что старая версия разделяемой dll находится в GAC.

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

0 голосов
/ 04 октября 2018

После проверки всех ответов здесь ничего не получилось.Тогда я понял, что мой сервис имел ошибку при просмотре wsdl в браузере.Это должно быть очевидно, верно?Что ж, посмотрим, что произошло, я открыл файл решения службы от имени другого пользователя (без прав администратора) и обновил имя одного из повторно используемых типов.Построил моё решение и всё построено успешно.Именно тогда я столкнулся с проблемой, описанной в ОП.

Произошло то, что произошло, потому что я вошел в систему с учетной записью без прав администратора и не использовал IIS express.Мой проект WCF не загрузился.Это означает, что переименование типа не вступило в силу в проекте WCF.Таким образом, вызывая проблему.

TLDR;Убедитесь, что ваша служба действительно запускается и работает правильно, прежде чем искать проблему в потребляющем приложении.

0 голосов
/ 21 августа 2018

Это старая тема, но поскольку я столкнулся с той же проблемой сегодня, я хочу поделиться своим исправлением.

Для меня проблема заключалась в том, что общая сборка была правильно добавлена ​​в оба проекта (сервис и клиент), но на стороне обслуживания эта общая сборка ссылалась на другую сборку, которой не было на стороне клиента.

Я заметил ошибку при использовании Svcutil.exe с приведенным ниже оператором.Откройте командную строку в папке, где находится SvcUtil.exe (для меня это C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v10.0A \ bin \ NETFX 4.6.1 Tools) и выполните оператор ниже после изменения нижесегменты (помеченные <>):

SvcUtil.exe /t:code /language:cs  /r:<path of the .dll that contains the types to reuse on client side> <wcf service url>

убедитесь, что .dll типов, которые вы хотите использовать физически, существуют в папке / bin (возможно, там нет из-за ошибки сборки, ...),При необходимости скопируйте правильную сборку из службы.

SvcUtil попытается сгенерировать контракты на обслуживание и / или данные на основе документа WSDL из указанной службы.Тег / r указывает, где находится DLL на стороне клиента, которая содержит повторно используемые типы (так же, как вы указываете при использовании «Добавить ссылку на службу»).

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

Это может указать вам правильное направление, в котором проблема заключается в вашей общей сборке.

...