具有单字节序列属性 Bug 的复杂类型的服务

本文关键字:Bug 属性 复杂 服务 类型 单字节 字节 | 更新日期: 2023-09-27 18:33:07

我正在尝试使用 WCF 使用服务(用 Java 构建和托管(,其中包含以下 XSD

<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"/>

当我从此服务请求数据时,出现以下错误:

"Base64 序列长度 (1( 无效。必须是 4 的倍数。

这很奇怪,因为返回的 xml 是这样的:

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

因此,它根本不是 Base64 编码的。显然,dotnet 使用此 xsd 并使其成为一个字节 [],该字节应包含导致错误的 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编码的内容无关。

具有单字节序列属性 Bug 的复杂类型的服务

您看到的行为实际上是预期的。 正如您已经注意到的,WCF 需要 base64 二进制编码数据来代替 byte[]。

我做了一些研究,发现此实现符合 SOAP 1.1 规范,该规范指出:不透明字节数组的推荐表示形式是 XML 模式 [10][11] 中定义的"base64"编码,它使用 2045 中定义的 base64 编码算法 [13]。

作为参考,下面是XSD和.Net Framework之间的类型映射的链接:http://msdn.microsoft.com/en-us/library/aa719879(v=vs.71(.aspx。 我还发现了 ORACLE's JAVA 的类型映射:http://docs.oracle.com/cd/E19159-01/819-3669/bnazt/index.html 也符合 SOAP 规范,有趣的是,有问题的 JAVA 服务的 XSD 没有遵循建议。

您的解决方法对我来说看起来不错。 您也可以使用 xs:short 来更好地使用内存。您可能需要在应用程序中将值强制转换为字节。