gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:13:59 25 4
gpt4 key购买 nike

我正在尝试使用包含以下 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><br/>
<xs:element name="ArrayOfBytes" nillable="true" type="tns:ArrayOfBytes"/>

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

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

让我认为这是一个错误的另一件事是将 XSD(其中的限制)从

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

<xs:restriction base="unsignedInt"/>

解决了这个问题。这显然与内容是否经过 base64 编码无关。

最佳答案

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

我做了一些研究,发现这个实现符合 SOAP 1.1 specification其中指出:不透明字节数组的推荐表示是 XML 模式 [10][11] 中定义的“base64”编码,它使用 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 来更好地使用内存。您可能需要在应用程序中将值转换为字节。

关于c# - 具有单字节序列属性的 complexType 服务,Bug?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27271962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com