2014-12-03 43 views
2

我試圖消耗它具有以下XSD包含具有單字節序列屬性的complexType服務,Bug?

<xs:simpleType name="SimpleByteType"> <xs:restriction base="xs:unsignedByte"/> </xs:simpleType> <xs:complexType name="ArrayOfBytes"> <xs:sequence> <xs:element name="SimpleByteType-item" type="tns:SimpleByteType" /> </xs:sequence> </xs:complexType>
<xs:element name="ArrayOfBytes" nillable="true" type="tns:ArrayOfBytes"/>

當我從這項服務中,我得到了下面的錯誤請求數據服務(內置和Java的託管)使用WCF:

"Base64 sequence length (1) not valid. Must be a multiple of 4."

這是奇怪的是返回的XML是這樣的:

<ArrayOfBytes> 
    <SimpleByteType-item>0</SimpleByteType-item> 
    <SimpleByteType-item>1</SimpleByteType-item> 
    <SimpleByteType-item>2</SimpleByteType-item> 
</ArrayOfBytes> 

所以,它根本不是Base64編碼的。顯然,dotnet會消耗這個xsd,並使其成爲一個byte [],它應該包含導致錯誤的base64編碼數據。

我在這裏做錯了什麼,或者這是WCF解釋XSD的方式的錯誤?對於使用Base64編碼數據的正確識別將是base64Binary類型看:http://www.w3.org/2002/ws/databinding/examples/6/09/Base64BinaryElement/

這使我覺得這是一個錯誤的另一件事是改變從

<xs:restriction base="xs:unsignedByte"/> 

的XSD(在它的限制),以

<xs:restriction base="unsignedInt"/> 

解決了這個問題。這顯然應該與base64編碼的內容無關。

回答

1

您看到的行爲實際上是預期的。正如你已經注意到的那樣,WCF期望base64Binary編碼數據代替byte []。

我做了一些研究,發現這實現符合其中規定的SOAP 1.1 specification: 字節的不透明數組的推薦表示是在XML模式[10] [11],其使用定義的「BASE64」編碼base64編碼算法在2045年定義[13]。

僅供參考,以下是XSD和.Net Framework之間的類型映射的鏈接:http://msdn.microsoft.com/en-us/library/aa719879(v=vs.71).aspx。我還發現ORACLE的JAVA的類型映射:http://docs.oracle.com/cd/E19159-01/819-3669/bnazt/index.html也符合SOAP規範,有趣的是,有問題的JAVA服務的XSD不遵循該建議。

您的解決方法對我來說看起來不錯。你也可以使用xs:short來獲得更好的內存使用。您可能需要在應用程序中將值轉換爲字節。

+0

就我所見,您所引用的關注點是一個應該有單個值的字段(base64 encode byte [],其中各個字節一起構成一個值)。然而,問題出在一個複雜類型的元素中,這是一個單字節值的序列。第一個,只能是一個字節[]作爲.Net中的字段,而後者可以是列表以及它只是一些字節值,它們之間沒有任何關係。 – thekip 2014-12-15 19:49:06

相關問題