У меня проблема, связанная с WSDL сторонней стороны. Я могу использовать консольное приложение, чтобы легко создать прокси-сервер службы, который работает, но из WF4 WF-сервиса я не являюсь. Сгенерированный прокси-сервер в последнем случае явно ошибочен, включая, в частности, 2 проблемы: a) Контракты сообщений всегда генерируются, когда они не запрашиваются или не нужны b) Неправильные ответные сообщения и используемые имена обертки xml, в результате чего возникают объекты с нулевым ответом и неудачная десериализация
Проблема, с которой я столкнулась, заключается в фактическом генерации класса Reference.cs на основе стороннего WSDL. В WSDL есть много операций, и по внешнему виду 2 из них такие же:
<operation name="pu013">
<documentation>
<description>Check-response service</description>
<help>The service handles (cut out)</help>
</documentation>
<input message="tns:pu013Request" />
<output message="tns:SimpleResponse" />
</operation>
...
<operation name="mi102">
<documentation>
<description>Instruction insert to Matching System</description>
<help>This service (cut out)</help>
</documentation>
<input message="tns:mi102Request" />
<output message="tns:SimpleResponse" />
</operation>
В результате этого в Reference.cs приведен следующий С#:
WorkflowService1.PSE.pu013Response pu013(WorkflowService1.PSE.pu013Request request);
...
WorkflowService1.PSE.pu013Response mi102(WorkflowService1.PSE.mi102Request request);
Обратите внимание, что по какой-либо причине операция mi102 генерируется с ответным сообщением INCORRECT pu013Response, которое объявляется следующим образом:
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ServiceModel.MessageContractAttribute(WrapperName="pu013Response", WrapperNamespace="http://pse/", IsWrapped=true)]
public partial class pu013Response {
Обратите внимание, что WrapperName не позволяет сериализатору XML распознавать ответ, который является mi102Response, поэтому для всех операций, которые не являются pu013, я всегда получаю NULL-ответ.
Кроме того, это НЕ происходит, если я добавляю ссылку из консольного приложения. Это не создает контракты с сообщением, и в этом случае работают вызов и ответ.
Чем отличается? Вызывается ли svcutil за кулисами? Если да, то чем отличаются используемые параметры? Можно ли использовать svcutil для создания действий xamlx, чтобы я мог найти обходной путь командной строки?
Это похоже на ошибку VS/Add Service Reference. Альтернативой является вручную исправить многие операции в Reference.cs.
В идеале, я ищу способ легко, автоматически запускать svcutil или Add Service Reference, чтобы корректный класс Reference и генерируемые действия xamlx. Приятно иметь объяснение, почему есть разница, и за кулисами происходит то, что происходит.
UPDATE: Контракты сообщений, сгенерированные в консольном приложении, приводят к одной и той же проблеме - неправильные объявления Response. Проблема исчезает, если параметры используются вместо сообщений, которые недоступны из приложения службы WF.