这不是Java特有的问题,但让我们在Java中有一个例子:Java世界中的一个标准做法是添加xmime:expectedContentTypes="*/*到base64元素以在服务器端启用MTOM处理 - 它导致@XmlMimeType注释,使用DataHandlers代替字节虽然这种描述当然大大简化了,但是xmime:expectedContentTypes="*/*当在模式中看到时,通常被开发人员(更重要的是也通过实现库)识别为"MTOM就绪".从我从示例中收集的内容来看,C#世界的情况是一样的.
然而,它确实对我没有意义 - 该属性指定了我们可能在XML中实际期望的数据类型,而不是它可以与MTOM一起使用.我还没有在SOAP 1.1的任何RFC或类似文档中找到预期内容类型和MTOM之间的任何直接连接.
我的问题可以用两种方式表达:
您似乎在附件,SOAP附件和MTOM之间略有混淆.
SOAP-Attachment于2000年12月作为W3C注释(不是规范)首次引入,并定义了SOAP 1.1中定义的传输绑定机制的扩展.特别是,这个说明定义了:
在MIME多部分/相关消息中携带的SOAP 1.1消息的绑定,以便保留SOAP 1.1消息的处理规则.用于封装复合文档的MIME多部分机制可用于捆绑与之相关的实体. SOAP 1.1消息,例如附件.
简单来说,它定义了一种机制,使用多部分mime结构进行传输,将多个文档(附件)与其本机格式的SOAP消息相关联.这是使用"Content-Location"和"Content-ID"标头的组合以及用于解释"Content-Location"标头引用的URI的一组规则来实现的.
这种格式的SOAP消息可以如下可视化(封装为multipart/mime):
这也是您在使用SAAJ时可能使用的格式,但不建议使用,除非您使用的是遗留代码.W3C注释后来在2004年被修订为"功能"级别(与SOAP 1.2一起),最终被 SOAP MTOM机制取代.
SOAP消息传输优化机制(MTOM)被官方定义为不是一个,而是三个独立的功能,它们协同工作以提供功能:
"抽象SOAP传输优化特征"描述了一种抽象特征,用于通过选择性地编码消息的部分来优化SOAP消息的传输和/或有线格式,同时仍向SOAP应用程序呈现XML信息集.
"SOAP消息的优化MIME多部分/相关序列化"描述了以绑定无关方式实现抽象SOAP传输优化功能的SOAP消息的优化MIME多部分/相关序列化.
"HTTP SOAP传输优化功能"描述了SOAP 1.2 HTTP绑定的抽象传输优化功能的实现.
如果您阅读第二个文档,您将意识到"附件"已被XML二进制优化的"包"或XOP 取代.
通过将XML Infoset的序列化放在可扩展的打包格式(例如,MIME Multipart/Related,参见[RFC 2387])中来创建XOP包.然后,提取并重新编码其内容的选定部分(base64编码的二进制数据)(即,从base64解码数据)并将其放入包中.这些选定部分的位置在XML中标记,并带有使用URI链接到打包数据的特殊元素.
简单来说,这意味着不是将数据封装为multipart/mime消息中的"附件",而是通过"指针"或链接来引用数据.以下图表可能有助于理解:
现在我们有了背景,让我们回到你的问题.
服务如何明确表示它接受/提供二进制数据作为请求/响应中的MTOM附件?它不是.没有MTOM附件的概念,因此服务器不能声明它接受附件.
客户端如何正确识别可以使用给定服务的MTOM附件发送/获取二进制数据?就像我上面说的那样,客户端无法做到这一点,因为不支持"附件".
话虽如此,还有另一个关于XML媒体类型的 W3C规范声明:
该xmime:的contentType属性信息项允许Web服务应用程序优化的二进制元素信息项中定义的二进制数据的处理,并应被视为元数据.xmime:contentType属性的存在不会更改元素内容的值.
当您使用xmime:contentType和启用MTOM时xmime:expectedContentTypes="application/octet-stream(*不应该使用),生成的WSDL将具有如下条目:
<element name="myImage" xmime:contentType="xsd:base64Binary" xmime:expectedContentTypes="application/octet-stream"/>
这是服务器声明它可以接收XML二进制优化包(可以分解为多部分MIME消息)的方式.
当客户端看到上述内容时,客户端知道服务器可以接受XML二进制优化包并根据定义生成适当的HTTP请求识别XOP文档:
XOP文档在类似MIME的系统中使用时,使用"application/xop + xml"媒体类型标识,所需的"type"参数传达原始XML序列化的关联内容类型.
希望有所帮助!
| 归档时间: |
|
| 查看次数: |
5697 次 |
| 最近记录: |