當我使用Visual Studio 2008(SP1)上的「添加服務引用」導入給定服務時,所有請求/響應消息都被不必要地包裝到消息合約中(名爲 - >「operationName 「+」請求「/」響應「+」1「結尾)。添加服務引用正在生成消息合同
代碼生成器說:
// CODEGEN: Generating message contract since the operation XXX is neither RPC nor
// document wrapped.
誰是從Java服務生成WSDL的人說,他們正在指定文檔 - 文字/ wrapped的。
任何幫助/指針/線索將不勝感激。
更新: 這是我的wsdl的一個樣本,其中一個操作看起來很可疑。請注意,與響應相比,請求的消息元素屬性不匹配。
<!- imports namespaces and defines elements -->
<wsdl:types>
<xsd:schema targetNamespace="http://WHATEVER/" xmlns:xsd_1="http://WHATEVER_1/" xmlns:xsd_2="http://WHATEVER_2/">
<xsd:import namespace="http://WHATEVER_1/" schemaLocation="WHATEVER_1.xsd"/>
<xsd:import namespace="http://WHATEVER_2/" schemaLocation="WHATEVER_2.xsd"/>
<xsd:element name="myOperationResponse" type="xsd_1:MyOperationResponse"/>
<xsd:element name="myOperation" type="xsd_1:MyOperationRequest"/>
</xsd:schema>
</wsdl:types>
<!- declares messages - NOTE the mismatch on the request element attribute compared to response -->
<wsdl:message name="myOperationRequest">
<wsdl:part element="tns:myOperation" name="request"/>
</wsdl:message>
<wsdl:message name="myOperationResponse">
<wsdl:part element="tns:myOperationResponse" name="response"/>
</wsdl:message>
<!- operations -->
<wsdl:portType name="MyService">
<wsdl:operation name="myOperation">
<wsdl:input message="tns:myOperationRequest"/>
<wsdl:output message="tns:myOperationResponse"/>
<wsdl:fault message="tns:myOperationFault" name="myOperationFault"/>
<wsdl:fault message="tns:myOperationFault1" name="myOperationFault1"/>
</wsdl:operation>
</wsdl:portType>
更新2:我把所有我在導入的命名空間了(他們是在一個單獨的XSD)到WSDL,因爲我懷疑進口可能觸發該消息的合約發電的類型。令我驚訝的是,並非如此,並且在wsdl中定義的所有類型都沒有改變任何內容。
然後,我(從絕望中)開始構建wsdls,並且使用包含在序列屬性中的元素屬性的maxOccurs
屬性來播放不需要的消息合約生成行爲。
下面是一個元件的一個示例:
<xsd:element name="myElement">
<xsd:complexType>
<xsd:sequence>
<xsd:element minOccurs="0" maxOccurs="1" name="arg1" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
上被用作消息元素與maxOccurs
播放(所有請求和響應基本上)將出現以下情況:
- 的maxOccurs = 「1」不觸發包裝
- macOcccurs> 1 觸發包裝
- 組的maxOccurs =「無界」 觸發包裹
我無法重現這個對我的生產WSDL但由於類型的嵌套去非常深,它會帶我的時間來仔細觀察一下。在此期間,我希望它可能響鐘 - 任何幫助高度讚賞。
也注意到 - 我不僅在特定的一個操作上遇到了所有操作錯誤。我似乎明白這可能是由於任何操作使用的任何類型定義的錯誤,這將導致DataContractSerialer被XmlSerializer,因此MEssageContracts取代。這種解釋是否有意義? – JohnIdol 2010-03-04 13:56:13