[C#] Как получить ссылку на службу, чтобы правильно генерировать сообщения с контрактами на основе сторонних WSDL или не принуждать никаких сообщений к контрактам в проекте WF Service


Answers

Я бы предложил вам сгенерированный прокси wsdl с помощью утилиты командной строки и добавить сгенерированный прокси-файл в ваш проект. Он будет работать из каждого проекта, и вы можете найти необходимые конфигурации из output.config, которые будут генерироваться из командной строки.

Если вам нужна команда wsdl и параметры, я могу предоставить вам.

Question

У меня проблема, связанная с тем, что сторонний WSDL я могу использовать в консольном приложении, чтобы легко создать прокси-сервер службы, который работает, но из WF4 WF-сервиса я не являюсь. Сгенерированный прокси-сервер в последнем случае явно ошибочен, что включает в себя, в частности, 2 проблемы: а) Контракты сообщений всегда генерируются, если они не запрашиваются или не нужны; б) Неправильные ответные сообщения и используемые имена оберток 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 это следующий C #:

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 или Добавить ссылку на службу, чтобы класс Reference был прав и генерировались действия xamlx. Приятно иметь объяснение, почему есть разница, и за кулисами происходит то, что происходит.

ОБНОВЛЕНИЕ . Контракты сообщений, сгенерированные в консольном приложении, приводят к одной и той же проблеме - неправильные объявления Response. Проблема исчезает, если параметры используются вместо сообщений, которые недоступны в приложении службы WF.