2011-12-01 28 views
1

我們具有包含下述類型定義一個WSDL:.NET SOAP序列化無界序列

... 
<xsd:complexType name="OrderItem"> 
    <xsd:all> 
    <xsd:element name="source" type="xsd:string" /> 
    </xsd:all> 
</xsd:complexType> 
<xsd:complexType name="OrderItems"> 
    <xsd:sequence> 
    <xsd:element name="item" type="tns:OrderItem" maxOccurs="unbounded" /> 
    </xsd:sequence> 
</xsd:complexType> 
... 

當添加服務爲在2010年VS服務引用,所述OrderItems類包含item屬性是類型的OrderItem[]。然後SOAP請求生成如下:

... 
<items> 
    <OrderItem> 
    <item>foo</item> 
    <item>bar</item> 
    </OrderItem> 
</items> 
... 

使用XmlArrayXmlArrayItem屬性,我們可以分別控制<OrderItem><item>元素的名稱,但不能得到所期望的結構:

... 
<items> 
    <item>foo</item> 
    <item>bar</item> 
</items> 
... 

我知道,如果WSDL指定類似<xsd:restriction base="soap-enc:Array">而不是無限序列,但是考慮到以上是使用某些自定義序列化的唯一方法,可以避免此問題?

編輯:示例WSDL在https://gist.github.com/1422704

+0

你還可以發佈消息的輸出類型中引用的元素的定義嗎? –

+0

是否正確無法更改Web服務和wsdl,並且您試圖通過操作客戶端類的XML序列化屬性來調整請求XML? –

+0

是的,WSDL是給出的,我們理想地使用帶有一些自定義序列化的Service Reference生成的類來產生所需的輸出。 – cmbuckley

回答

1

看來,.NET WCF服務不玩我們的WSDL(這是手動,重點對XSD,而不是SOAP創建)不錯。

得到SOAP API與.NET的最簡便的方法是改變使用SOAP數組類型的WSDL,所以<items>變得與soap-enc:arrayType="tns:OrderItem[]"一個soap-enc:Array

服務引用自動生成的代碼生成的結果XML是正確的。

+0

@cubuckley 我被困在使用.Net生成代理的類似問題上。我有你的想法,但不知何故,我無法將序列下的元素屬性轉換爲soap-enc:Array。您可以請您分享您最初的問題中與wsdl相對應的最終wsdl示例。提前致謝。 –

+0

Hi @ brain.overflow,我會嘗試挖掘工作的WSDL並將其添加到今天的答案中。 – cmbuckley

+0

@cubuckley感謝的人,這將不勝感激:) –