为 JAX-WS Web Service 启用 MTOM
使用 Java™ API for XML-Based Web Services (JAX-WS),可以将二进制附件(例如图像或文件)与 Web Service 请求一起发送。JAX-WS 添加了对二进制数据进行优化传输的支持,如 SOAP 消息传输优化机制 (MTOM) 规范中所指定。
关于此任务
JAX-WS 支持使用 SOAP 消息传输优化机制 (MTOM) 来发送二进制附件数据。通过启用 MTOM,可以按最优方式发送和接收二进制数据,而不会带来在 XML 文档中嵌入二进制数据所需的数据编码开销。
应用程序服务器仅对 JAX-WS 应用程序支持使用 MTOM 发送附件。此产品也可让您通过使用新的 MTOM 和 XOP 标准,随 Web Service 安全性 SOAP 消息提供附件。
JAX-WS 应用程序可以将二进制数据作为包含在 XML 文档中的 base64 或 hexBinary 编码数据来发送。但是,为了利用 MTOM 所提供的优化,应使 MTOM 能够将二进制 base64 数据作为包含在 XML 文档外部的附件来发送。缺省情况下,不启用 MTOM 优化。JAX-WS 应用程序要求单独配置客户机和服务器工件以便启用 MTOM 支持。
过程
结果
您已开发 JAX-WS Web Service 服务器和客户机应用程序,对使用 MTOM 发送和接收二进制数据的操作进行了优化。
示例
以下示例说明了从 WSDL 文件开始时对 Web Service 客户机和服务器端点启用 MTOM 支持的过程。
- 找到包含 xsd:base64Binary 元素的 WSDL 文件。以下示例是包含 xsd:base64Binary 元素的 WSDL 文件的一部分。
<types> ........ <xs:complexType name="ImageDepot"> <xs:sequence> <xs:element name="imageData" type="xs:base64Binary" xmime:expectedContentTypes="image/jpeg"/> </xs:sequence> </xs:complexType> ........ </types>
- 从 app_server_root\bin\ 目录对 WSDL 文件运行 wsimport 命令以生成一组 JAX-WS 可移植工件。
根据在 WSDL 文件中包含的 expectedContentTypes 值,生成的 JAXB 工件将使用 Java 类型,如下表中所述:
表 1. MIME 类型和 Java 类型的映射. 描述 MIME 类型和 Java 类型之间的映射。 MIME 类型 Java 类型 image/gif java.awt.Image image/jpeg java.awt.Image text/plain java.lang.String text/xml javax.xml.transform.Source application/xml javax.xml.transform.Source */* javax.activation.DataHandler - 按照与在任何其他 JAX-WS 应用程序中相同的方式使用 JAXB 工件。使用这些 Bean 从 Dispatch 和 Dynamic proxy client API 发送二进制数据。
- 对 Dispatch client 启用 MTOM。
//Create the Dispatch instance. JAXBContext jbc = JAXBContext.newInstance("org.apache.axis2.jaxws.sample.mtom"); Dispatch<Object> dispatch = svc.createDispatch(portName, jbc, Service.Mode.PAYLOAD); //Enable MTOM. SOAPBinding binding = (SOAPBinding) dispatch.getBinding(); binding.setMTOMEnabled(true);
- 对动态代理客户机启用 MTOM。
在启用 JAX-WS 客户机使用 MTOM 后,发送至服务器的消息启用了 MTOM。但是,要使服务器通过使用 MTOM 对客户机作出响应,必须对端点启用 MTOM。//Create the Dynamic Proxy instance. Service svc = Service.create(serviceName); MtomSample proxy = svc.getPort(portName, MtomSample.class); //Enable MTOM. BindingProvider bp = (BindingProvider) proxy; SOAPBinding binding = (SOAPBinding) bp.getBinding(); binding.setMTOMEnabled(true);
- 对端点实现类启用 MTOM。
jaxax.xml.ws.SOAPBinding 类为各个受支持的绑定类型提供了一个静态成员。将 SOAP11HTTP_MTOM_BINDING 或 SOAP12HTTP_MTOM_BINDING 包括为 @BindingType 注释的值。此值使所有服务器响应都能够启用 MTOM。@MTOM(enabled, threshold=4096) @WebService (endpointInterface="org.apache.axis2.jaxws.sample.mtom.MtomSample") public class MtomSampleService implements MtomSample { .... }
对服务器和客户机启用 MTOM 时,表示附件的二进制数据作为 SOAP 消息的多用途因特网邮件扩展 (MIME) 附件来包括。如果不使用 MTOM,那么将使用描述 XML 模式的格式(基本 64 位或十六进制编码)对同一数据进行编码并且通过内联的方式将其包括在 XML 文档中。
... other transport headers ...
Content-Type: multipart/related; boundary=MIMEBoundaryurn_uuid_0FE43E4D025F0BF3DC11582467646812;
type="application/xop+xml"; start="
<0.urn:uuid:0FE43E4D025F0BF3DC11582467646813@apache.org>"; start-info="text/xml"; charset=UTF-8
--MIMEBoundaryurn_uuid_0FE43E4D025F0BF3DC11582467646812
content-type: application/xop+xml; charset=UTF-8; type="text/xml";
content-transfer-encoding: binary
content-id:
<0.urn:uuid:0FE43E4D025F0BF3DC11582467646813@apache.org>
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<sendImage xmlns="http://org/apache/axis2/jaxws/sample/mtom">
<input>
<imageData>
<xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include"
href="cid:1.urn:uuid:0FE43E4D025F0BF3DC11582467646811@apache.org"/>
</imageData>
</input>
</sendImage>
</soapenv:Body>
</soapenv:Envelope>
--MIMEBoundaryurn_uuid_0FE43E4D025F0BF3DC11582467646812
content-type: text/plain
content-transfer-encoding: binary
content-id:
<1.urn:uuid:0FE43E4D025F0BF3DC11582467646811@apache.org>
… binary data goes here …
--MIMEBoundaryurn_uuid_0FE43E4D025F0BF3DC11582467646812--
... other transport headers ...
Content-Type: text/xml; charset=UTF-8
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<sendImage xmlns="http://org/apache/axis2/jaxws/sample/mtom">
<input>
<imageData>R0lGADl ... more base64 encoded data ... KTJk8giAAA7</imageData>
</input>
</sendImage>
</soapenv:Body>
</soapenv:Envelope>
有关更多信息,请参阅信息中心的“样本”部分,此部分包含一个演示如何将 MTOM 与 JAX-WS Web Service 一起使用的样本。