Иногда при добавлении ссылки на службу WCF создается пустой файл reference.cs - PullRequest
151 голосов
/ 11 сентября 2009

Иногда при добавлении ссылки на службу WCF создается пустой файл reference.cs, и я не могу ссылаться на службу где-либо в проекте.

Кто-нибудь сталкивался с этим?

Ответы [ 16 ]

369 голосов
/ 11 сентября 2009

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

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

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

37 голосов
/ 06 января 2012

Как указано в принятом ответе, проблема со ссылкой на тип при повторном использовании типов, вероятно, является причиной. Я обнаружил, что если вы не можете легко определить проблему, то использование командной строки svcutil.exe поможет вам выявить основную проблему (как указывает Джон Сондерс).

В качестве улучшения приведен краткий пример использования svcutil.

svcutil /t:code https://secure.myserver.com/services/MyService.svc /d:test /r:"C:\MyCode\MyAssembly\bin\debug\MyAssembly.dll"

Где:

  • / t: код генерирует код по заданному URL-адресу
  • / d: указать каталог для вывода
  • / r: указать справочную сборку

Полная ссылка на командную строку svcutil здесь: http://msdn.microsoft.com/en-us/library/aa347733.aspx

Как только вы запустите svcutil, вы увидите, что исключение выдается при импорте. Вы можете получить сообщение такого типа об одном из ваших типов: «ссылочный тип не может быть использован, поскольку он не соответствует импортированному DataContract».

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

Существуют и другие, более сложные сценарии, которые могут вызывать исключения такого типа и приводить к пустым файлам reference.cs. Вот один пример .

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

11 голосов
/ 28 сентября 2012

Я целый день ломал голову над этой проблемой. Я только что исправил это. Вот как ...

Служба имела для запуска по SSL (то есть она на https://mydomain.com/MyService.svc)

Добавление ссылки на службу в службу WCF на сервере разработки работало просто отлично.

Развертывание точной той же сборки службы WCF на работающем производственном сервере, затем переключение на клиентское приложение и настройка ссылки на службу для указания на действующую службу не отображало ошибок, но приложение не build: Оказывается, что файл Reference.cs справочной службы был полностью пустым! Обновление сервисной ссылки не имело никакого значения. Очистка раствора не помогла. Перезапуск VS2010 не имел значения. Создание нового пустого решения, запуск консольного проекта и добавление ссылки на службу в действующую службу показало точно такую ​​же проблему.

Я не думал, что это было из-за конфликтующих типов или чего-то еще, но какого черта - я перенастроил ссылку на службу WCF, сняв флажок «Повторное использование типов во всех ссылочных сборках». Нет радости; Я поставил галочку обратно.

Следующим шагом была попытка svcutil на ссылочном URL, чтобы увидеть, поможет ли это выявить проблему. Вот команда:

svcutil /t:code https://mydomain.com/MyService.svc /d:D:\test

Это произвело следующее:

Microsoft (R) Service Model Metadata Tool
[Microsoft (R) Windows (R) Communication Foundation, Version 4.0.30319.1]
Copyright (c) Microsoft Corporation.  All rights reserved.

Attempting to download metadata from 'https://mydomain.com/MyService.svc' using WS-Metadata Exchange or DISCO.
Error: Cannot import wsdl:portType
Detail: An exception was thrown while running a WSDL import extension: System.ServiceModel.Description.DataContractSerializerMessageContractImporter
Error: Schema with target namespace 'http://mynamespace.com//' could not be found.
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://mynamespace.com//']/wsdl:portType[@name='IMyService']


Error: 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://mynamespace.com//']/wsdl:portType[@name='IMyService']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:binding[@name='WSHttpBinding_IMyService']


Error: Cannot import wsdl:port
Detail: There was an error importing a wsdl:binding that the wsdl:port is dependent on.
XPath to wsdl:binding: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:binding[@name='WSHttpBinding_IMyService']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:service[@name='MyService']/wsdl:port[@name='WSHttpBinding_IMyService']


Generating files...
Warning: No code was generated.
If you were trying to generate a client, this could be because the metadata documents did not contain any valid contracts or services
or because all contracts/services were discovered to exist in /reference assemblies. Verify that you passed all the metadata documents to the tool.

Warning: If you would like to generate data contracts from schemas make sure to use the /dataContractOnly option.

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

Я удаленно работал одновременно как с разработчиками, так и с живыми блоками, и на каждом из них запускал IIS Manager (работает под управлением IIS 7.5). Затем я просмотрел каждый параметр конфигурации в каждом окне и сравнил значения на каждом сервере.

И есть проблема: в разделе «Настройки SSL» для сайта убедитесь, что установлен флажок «Требовать SSL», и установите переключатель «Сертификаты клиента» на «Принять». Проблема исправлена!

9 голосов
/ 11 сентября 2009

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

4 голосов
/ 24 апреля 2012

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

  1. Удалите сервисную ссылку, имеющую проблемы.
  2. Нажмите на название проекта в Solution Explorer , чтобы выделить проект.
  3. Щелкните правой кнопкой мыши ссылку на проект.
  4. В верхней части контекстного списка щелкните элемент Очистить .
  5. Добавьте ссылку на сервис, как обычно.

Надеюсь, это поможет.

3 голосов
/ 25 июля 2013

У меня была эта проблема с Silverlight 5, обновленной с предыдущей версии.

Даже повторное добавление ссылки на сервис все равно давало мне пустой Reference.cs

В итоге мне пришлось создать новый проект и заново создать ссылку на сервис. Это то, что можно попробовать, если вы потратили на это более получаса. Даже если вы полны решимости исправить исходный проект, вы можете попробовать это, просто чтобы посмотреть, что произойдет, и затем работать в обратном направлении, чтобы решить проблему.

Я так и не выяснил, в чем именно проблема - но, возможно, что-то в файле .csproj не было обновлено или некоторые настройки пошли не так.

1 голос
/ 03 сентября 2015

Следующее здесь не указано, и это было решение, которое я принял (SvcUtils был полезен при просмотре сообщения об ошибке. Однако ошибка, которую я получил, была wrapper type message cannot be projected as a data contract type since it has multiple namespaces. То есть я последовал этому примеру и узнал о wsdl.exe через это сообщение).

В моем случае, просто запустив wsdl [ my-asmx-service-address ], мы сгенерировали беспроблемный файл .cs, который я включил в свой проект и создал для использования службы.

1 голос
/ 26 августа 2015

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

Тогда вам просто нужно угадать, что не так с этим кодом.

Некоторые сообщения об ошибках в инструменте, конечно, помогли бы.

Я пишу контракт на веб-сервис. У меня был список-заполнитель без членов. Это нормально. Но если я использую его в свойстве другого класса и повторно использую контрактную dll на клиенте, кодовый код взрывается без сообщения об ошибке. Запуск svcutil.exe не помог, просто не удалось вывести файл cs без указания причины.

1 голос
/ 14 мая 2013

Моя проблема заключалась в том, что я оставил « mex » в конце ссылки на веб-сервис.

Вместо "http://yeagertech.com/yeagerte/YeagerTechWcfService.YeagerTechWcfService.svc/mex"

Использовать "http://yeagertech.com/yeagerte/YeagerTechWcfService.YeagerTechWcfService.svc"

1 голос
/ 11 апреля 2013

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

[CollectionDataContract(Name="AItems", ItemName="A")]
public class CollectionA : List<A> { }

[CollectionDataContract(Name="AItems", ItemName="A")]  // Wrong
public class CollectionB : List<B> { }

Я исправил ошибку, просмотрев свой проект и убедившись, что каждый атрибут Name и ItemName уникален:

[CollectionDataContract(Name="AItems", ItemName="A")]
public class CollectionA : List<A> { }

[CollectionDataContract(Name="BItems", ItemName="B")]  // Corrected
public class CollectionB : List<B> { }

Затем я обновил ссылку на сервис, и все снова заработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...