Я пытаюсь сгенерировать веб-сервис .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?