Ошибка создания клиента.net через сервисные ссылки
Я столкнулся с проблемой при попытке создать прокси-клиент в C# .Net 4.0 для веб-сервиса, определенного по этой ссылке wsdl: (я не управляю этим сервисом, и он, похоже, является сервисом Axis2 MTOM Java)
Вот генератор обратной связи:
1):
Details: An exception was thrown while running a WSDL import extension: System.ServiceModel.Description.DataContractSerializerMessageContractImporter
Error: Object reference not set to an instance of an object.
XPath to the source of error: //wsdl:definitions[@targetNamespace='http://sls.ws.coliposte.fr']/wsdl:portType[@name='ServiceV3WS']
2):
Error: Unable to import wsdl:binding
Detail: An error occurred while importing wsdl:portType which depends wsdl:binding.
XPath to wsdl:portType: //wsdl:definitions[@targetNamespace='http://sls.ws.coliposte.fr']/wsdl:portType[@name='ServiceV3WS']
XPath to the source of error: //wsdl:definitions[@targetNamespace='http://sls.ws.coliposte.fr']/wsdl:binding[@name='SlsServiceWSSoapBinding']
3):
Error: Unable to import wsdl:port
Detail: An error occurred while importing wsdl:binding which depends wsdl:port.
XPath to wsdl:binding: //wsdl:definitions[@targetNamespace='http://sls.ws.coliposte.fr']/wsdl:binding[@name='SlsServiceWSSoapBinding']
XPath to the source of error: //wsdl:definitions[@targetNamespace='http://sls.ws.coliposte.fr']/wsdl:service[@name='SlsServiceWS']/wsdl:port[@name='SlsServiceWSPort']
- Эти ошибки кажутся мне загадочными, но кажется, что ошибки 2 и 3 зависят от ошибки 1. Поэтому я предположил, что сначала эта служба не соответствовала требованиям (например,
portType
не был определен с правильным путем). Поэтому я попытался проверить это с помощью валидатора wsdl (я пробовал http://wsdl-analyzer.com/), и он возвращает мне, что все было в порядке. - Поэтому моя вторая гипотеза состояла в том, что я сгенерировал прокси неправильно:
- Я пытался использовать "стандартный путь WCF" через пункт меню " добавить ссылку на службу " из Visual Studio (2012).
- Я также пытаюсь сгенерировать клиентский прокси, используя svcutil.exe (v 4.0.30319.xxx). Очевидно, он возвращает те же ошибки. (Кажется, svcutil используется в бэкэнде VS.)
Что я ожидаю:
Ну, я видел много связанных вопросов на SO об этом виде генерации прокси. Но моя главная проблема в том, что я не совсем понимаю, в чем проблема. Поэтому я решил опубликовать новый вопрос, чтобы запросить объяснение этих ошибок: что они означают, почему появляются такие ошибки и каковы альтернативные способы / инструменты для создания такого прокси.
Так что это мой первый пост на SO, так что не стесняйтесь просматривать и комментировать.
Заранее спасибо и до встречи.
1 ответ
Мне требуется несколько часов, чтобы найти информацию об этой проблеме, я нашел ответы на свои вопросы и решил ее.
Я посмотрел на svcutil.exe
страница документации и опробованные варианты, которые лучше всего подходят для моей проблемы ("случайно" - это фактический термин).
После нескольких циклов проб и ошибок кажется, что опция /serializer:XmlSerializer, которая "генерирует типы данных, использующие XmlSerializer для сериализации и десериализации", отсутствовала в моем случае. Для информации по умолчанию используется значение /serializer:Auto, которое "генерирует классы, отмеченные атрибутом Serializable".
Что касается моих предыдущих вопросов, я могу сказать:
Понимание проблемы: сейчас эти ошибки все еще загадочны для меня. Эта "ссылка на объект, не установленная для экземпляра объекта", на самом деле не была хорошим дескриптором "реальной" проблемы. Может быть, имя инкриминирующего класса
System.ServiceModel.Description.DataContractSerializerMessageContractImporter
был ключ, который я пропустил.Альтернативы для создания такого прокси:
svcutil
является альтернативой стандартному пункту меню " Добавить сервисную ссылку ". Это позволяет использовать настраиваемый набор параметров в соответствии с контекстом целевой службы. Как недостаток, он гораздо менее интегрирован в обычный рабочий процесс архитектуры Visual Studio. Таким образом, необходимо вручную интегрировать сгенерированные выходные классы прокси и его файл конфигурации. Таким образом, каждый раз прокси будет обновляться, что, в конце концов, не является невозможной задачей.
В заключение, возможно, улучшение, которое нужно сделать, - позволить пользователю настроить свой собственный набор параметров в пользовательском интерфейсе генерации VS (если вы видите этот поток и работаете в Microsoft над проектом VS, вы знаете, что делать:))
Спасибо. Ожидание этого ответа может помочь любому в подобной ситуации.