我尝试使用包含以下XSD的WCF来使用服务(使用Java构建和托管)
<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"/>
当我从此服务请求数据时,我收到以下错误:
&#34; Base64序列长度(1)无效。必须是4的倍数。&#34;
这很奇怪,因为返回的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/
让我觉得这是一个错误的另一件事是改变XSD(其中的限制)来自
<xs:restriction base="xs:unsignedByte"/>
到
<xs:restriction base="unsignedInt"/>
解决了这个问题。这显然应该与base64编码的内容无关。
答案 0 :(得分:1)
您看到的行为实际上是预期的。正如您已经注意到的,WCF期望base64Binary编码数据代替byte []。
我做了一些研究,发现这个实现符合SOAP 1.1 specification的规定: 不透明字节数组的推荐表示是&#39; base64&#39; XML Schemas [10] [11]中定义的编码,它使用2045 [13]中定义的base64编码算法。
作为参考,这里是指向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来获得更好的内存使用率。您可能需要在应用程序中将值转换为byte。