Как настроить сгенерированный svcutil код, чтобы он восстанавливал правильный WSDL? - PullRequest
1 голос
/ 29 ноября 2010

Я пытаюсь сгенерировать веб-сервис .NET SOAP (используя svcutil) из существующего WSDL. WSDL содержит следующую информацию:

<types>
<xsd:schema>
<!-- ... -->
<xsd:complexType name="DoStuffType">
  <xsd:sequence>
    <xsd:element name="..." type="..." />
  </xsd:sequence>
</xsd:complexType>
<xsd:complexType name="DoStuffResponseType">
  <xsd:sequence>
    <xsd:element name="..." type="..." />
  </xsd:sequence>
</xsd:complexType>
<xsd:element name="DoStuff" type="tns:DoStuffType" />
<xsd:element name="DoStuffResponse" type="tns:DoStuffResponseType" />
</xsd:schema>
</types>

<message name="DoStuffSoapIn">
  <part name="messagePart" element="tns:DoStuff" />
</message>
<message name="DoStuffSoapOut">
  <part name="messagePart" element="tns:DoStuffResponse" />
</message>

<portType name="ASoapService">
  <operation name="DoStuff">
    <input message="tns:DoStuffSoapIn" />
    <output message="tns:DoStuffSoapOut" />
  </operation>
</portType>

Сгенерированный код компилируется и развертывается OK, но WSDL, который генерирует он , не содержит подробностей операции DoStuff.

Если я удалю атрибут [OperationContract(ReplyAction = "*")], я получу следующую ошибку от службы:

System.InvalidOperationException: An exception was thrown in a call to a 
  WSDL export extension: 
System.ServiceModel.Description.DataContractSerializerOperationBehavior 
  contract: http://example.com/services:ASoapService----> 
System.InvalidOperationException: Top level XML element with name
  DoStuffResponse in namespace http://example.com/services cannot reference
  http://schemas.datacontract.org/2004/07/Generated:DoStuffResponseType type 
  because it already references a different type 
  (http://example.com/services:DoStuffResponseType). 
Use a different operation name or MessageBodyMemberAttribute to specify a 
  different name for the Message or Message parts.

Если я затем удаляю атрибут [MessageContract(IsWrapped="false")] из кода ответа, я получаю следующую ошибку:

System.InvalidOperationException: The operation 'DoStuff' could not be loaded 
  because it has a parameter or return type of type 
  System.ServiceModel.Channels.Message or a type that has 
  MessageContractAttribute and other parameters of different types. When using 
  System.ServiceModel.Channels.Message or types with MessageContractAttribute, 
  the method must not use any other types of parameters.

Кроме того, удаление атрибута [MessageContract(IsWrapped="false")] из кода запроса устраняет все ошибки, но (что неудивительно, возможно) приводит к необходимости переноса запроса с элементами <request>.

Что мне нужно сделать с сгенерированным кодом, чтобы он мог восстановить правильный WSDL?

1 Ответ

0 голосов
/ 13 мая 2013

Согласно ответу на аналогичный вопрос решение состоит в том, чтобы удалить ReplyAction = "*" часть, но сохранить атрибут OperationContract.

...