具有单字节序列属性的complexType服务,Bug?

时间:2014-12-03 12:37:43

标签: c# wcf xsd xml-serialization datacontractserializer

我尝试使用包含以下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编码的内容无关。

1 个答案:

答案 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。