2010-03-03 70 views
15

當我使用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但由於類型的嵌套去非常深,它會帶我的時間來仔細觀察一下。在此期間,我希望它可能響鐘 - 任何幫助高度讚賞。

+0

也注意到 - 我不僅在特定的一個操作上遇到了所有操作錯誤。我似乎明白這可能是由於任何操作使用的任何類型定義的錯誤,這將導致DataContractSerialer被XmlSerializer,因此MEssageContracts取代。這種解釋是否有意義? – JohnIdol 2010-03-04 13:56:13

回答

1

你有沒有嘗試使用scvutil 轉到 - >開始菜單/ Visual Studio 2008中/工具/ VS命令提示符

類型SvcUtil工具,然後檢查出來的參數,尤其是/包裝參數。最終,用它來生成你的代理,它可以讓你什麼在

+0

我嘗試過使用svcutil並得到同樣的問題,但沒有使用/ wrapper參數 - 將檢查出 – JohnIdol 2010-03-04 13:35:25

4

這裏發生了很多更多的控制是另一個項目的檢查:

  1. 右鍵單擊在解決方案資源管理器服務引用,並選擇「配置服務參考'

  2. 檢查是否選中「始終生成消息合同」。

+0

已經去那裏 - 該框沒有選中,但很好的建議! :) – JohnIdol 2010-03-12 09:42:47

+1

爲我做了詭計。謝謝! – 2013-12-04 23:07:10

2

雖然我知道這是一個漫長的過時條目,對於那些在這個同樣的問題絆倒:

仔細檢查,這是生成的代理不包含任何鋸齒陣列,例如

(C#)

private string[][] mystring; 

(VB.NET)

Private myString()() As String 
4

你有沒有試圖改變WSDL,以便對部分元素=的每一個實例 「TNS:myOperation」 NAME =「請求「,將名稱屬性的值更改爲」參數「。

4

我有這個相同的問題,這解決了它。

我用這個:

<wsdl:message name="Method"> 
     <wsdl:part name="parameters" element="s0:Method"/> 
    </wsdl:message> 

    <wsdl:message name="MethodResponse"> 
     <wsdl:part name="parameters" element="s0:MethodResponse"/> 
    </wsdl:message> 

相反的:

<wsdl:message name="Method"> 
     <wsdl:part name="request" element="s0:Method"/> 
    </wsdl:message> 

    <wsdl:message name="MethodResponse"> 
     <wsdl:part name="response" element="s0:MethodResponse"/> 
    </wsdl:message> 

相信別人前面提到它,但我不能給予好評他們的答案呢!

相關問題