2014-12-03 35 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

相关问题