Ответ 1
По-видимому, вы должны добавить ссылку на System.Web в свой проект, прежде чем добавлять ссылку на службу. Так оно и было.
Я пытаюсь использовать службу WCF в библиотеке классов, добавляя к ней служебную ссылку. В одной из библиотек классов он потребляется должным образом, и я могу получить доступ к типам клиентов, чтобы сгенерировать прокси-сервер. Однако в моей библиотеке второго класса (или даже в тестовом приложении консоли), когда я добавляю одну и ту же служебную ссылку, она предоставляет только типы, которые участвуют в контрактных операциях, а не тип клиента, для того чтобы я мог создать прокси-сервер.
например. Конечная точка имеет две службы - ISvc1 и ISvc2. Когда я добавляю ссылку на эту конечную точку в библиотеке первого класса, я получаю ISvc1Client и /ISvc 2Client для создания прокси-сервера, чтобы использовать операции, которые были открыты через эти 2 контракта. В дополнение к этим клиентам ссылка на службу также раскрывает типы, связанные с такими операциями, как (тип 1, тип 2 и т.д.), Это то, что мне нужно. Однако, когда я пытаюсь добавить ссылку на службу к тому же концу в другом консольном приложении или библиотеке классов, отображаются только тип 1, тип 2 и т.д., А не ISvc1Client и ISvc2Client, из-за которых я не могу создать прокси для доступа к необходимым мне операциям. Я не могу определить, почему ссылка на службу правильно создается в одной библиотеке классов, но не в другом или тестовом консольном приложении.
По-видимому, вы должны добавить ссылку на System.Web в свой проект, прежде чем добавлять ссылку на службу. Так оно и было.
Возможно, вы выбрали Reuse types in specified reference assemblies
, но не выбрали очень важную библиотеку mscorlib
.
Сначала нажмите "Показать все файлы" в верхней части вашего обозревателя решений, чтобы вы могли расширить служебную ссылку.
Reference.cs
и откройте его.ClientBase
в исходном коде, чтобы убедиться, что вы действительно не создали клиента с именем, которого вы не ожидали. Если вы найдете это, то имя вашего клиента службы.
Если ничего не соответствует, щелкните правой кнопкой мыши ссылку на службу и выберите Configure Service Reference
.
Важным является mscorlib
, который необходим для правильного создания клиента. Мне нравится выбирать System.Xml.Linq
также для получения хороших классов Linq, таких как XElement
, а не XmlElement
.
Совет. Я всегда предпочитаю создавать выделенную 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).
Реальный ответ: если вы сериализуете тип с помощью KnownTypeAttribute в своем контракте на обслуживание, вы ДОЛЖНЫ включать ссылку на вашу библиотеку типов в проекте, к которому вы добавляете ссылку на службу.
Например, если ваша служба wcf сериализует тип System.Drawing.Image, тогда потребительский проект ДОЛЖЕН иметь ссылку на System.Drawing. Надеюсь, это поможет некоторым людям.
Я столкнулся с той же проблемой. Оказывается, мой проект ссылался на DLL напрямую, а не на ссылку на проект. Поэтому, хотя в моем проекте была ссылка на сборку, это была старая версия. Как только я обновил DLL и обновил сервисную ссылку, все снова работало.
Это обычно происходит для добавления ссылки на службу, которую вы добавили ранее. В конфигурации клиента он все еще имеет соответствующую servicemodel. Убедитесь, что вы удалили servicemodel из конфигурации клиента, а затем попробуйте снова добавить ссылку на службу!
Я столкнулся с подобной проблемой, так как это связано с несоответствием типов. Из-за чего я не смог создать клиента в тестовом проекте. Мы поддерживаем разные версии контрактов, а при создании новой версии я вводил ошибку несоответствия типа. Следующим был сценарий кода в моем случае.
Версия 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, это поможет решить эту проблему.
В соответствии с ответами @Kevin я добавил ссылки на все проекты и библиотеки DLL, упомянутые в проекте службы. После этого генерация прокси-сервера могла распознавать/генерировать требуемые типы.
Как только это будет сделано, вы даже можете начать удаление некоторых и регенерировать, чтобы исключить избыточные.