java - JAX-WS 始终内联发送 MTOM 附件

标签 java web-services soap client mtom

基本上我想创建一个 Web 服务客户端以通过代理方法发送 mtom soap 消息。我已经通过 Web 服务 wsdl 创建了我的服务工件。消息已正确创建,但是当我启用 mtom 并添加附件时,附件始终以内联方式发送,而不是在单独的 mime 部分中发送。它类似于 mtom 已启用,但由于某种原因,它决定不优化消息,因此将其内联发送。通过 soapui 运行相同的代码会给出正确的结果,所以我知道服务本身会接受它。

这是我创建 soap 请求并发送它的基本代码。 我启用了 mtomfeature,但也尝试过使用 soapBinding.setMTOMEnabled(true); 对于这两种方法,我都使用 ((SOAPBinding) binding).isMTOMEnabled() 对其进行了调试,以检查它是否已设置为启用。

// initiate services....

// create service and enable mtom
WebServiceBlah service = new WebServiceBlah(new URL(wsdlURL), SERVICE_NAME);
WebServiceBlahPort port = service.getWebServiceBlahPort(new MTOMFeature(true, 3072));

// load file
File file = new File("/home/mypdf.pdf");
FileInputStream fileinputstream = new FileInputStream(file);
int numberBytes = fileinputstream.available();
byte bytearray[] = new byte[numberBytes];
fileinputstream.read(bytearray);
fileinputstream.close();

// create uploadResult
UploadResult request = new UploadResult();

// create attachment
AttachmentType attachment = new AttachmentType();
attachment.setContentType("application/doc");
attachment.setValue(bytearray);

// create result and add attachment to it
RenderedResult result = new RenderedResult();
result.setResult(attachment);
result.setResultContentType("pdf");
result.setResultName("a pdf file");

// add result to request
request.getResult().add(result);

// send request
port.UploadResults(request);

我得到的是我的附件是在线发送的,如下所示。 (用wireshark捕获)

POST /blah/ws/ HTTP/1.1
Content-type: multipart/related;start="<rootpart*15c3ee3b-60c7-4726-a52c-8080965e4536@example.jaxws.sun.com>";type="application/xop+xml";boundary="uuid:15c3ee3b-60c7-4726-a52c-8080965e4536";start-info="text/xml"
Soapaction: ""
Accept: text/xml, multipart/related, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
User-Agent: JAX-WS RI 2.1.6 in JDK 6
Host: 123.123.123.123
Connection: keep-alive
Content-Length: 12372

--uuid:15c3ee3b-60c7-4726-a52c-8080965e4536    
Content-Id: <rootpart*15c3ee3b-60c7-4726-a52c-8080965e4536@example.jaxws.sun.com>    
Content-Type: application/xop+xml;charset=utf-8;type="text/xml"    
Content-Transfer-Encoding: binary

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header></S:Header>
<S:Body>
<ns2:uploadResult xmlns:xmime="http://www.w3.org/2005/05/xmlmime">
    <renderedResult>
        <result xmime:contentType="application/doc">JVBERi0xLjQKJaqrrK0KNCAwIG9iago8</result>
        <resultContentType>pdf</resultContentType>
        <resultName>a pdf file</resultName>
    </renderedResult>
</ns2:uploadResult>
</S:Body>
</S:Envelope>
--uuid:15c3ee3b-60c7-4726-a52c-8080965e4536

我想要的是将结果标记中的附件替换为内联标记,并将附件添加到不同 mime 部分的 soap 消息中。例如

<result xmime:contentType='application/doc'>
    <inc:Include href="cid:myid3" xmlns:inc='http://www.w3.org/2004/08/xop/include'/>
</result>

然后将以下内容添加到 soap 消息中

------=_Part_10_28027205.1314348995670
Content-Type: application/pdf
Content-Transfer-Encoding: binary
Content-ID: cid:myid3
Content-Disposition: attachment; name="mypdf.pdf"
JVBERi0xLjQKJaqrrK0KNCAwIG9iago8

最佳答案

许多因素会影响 MTOM 附件是否被实际使用。

在服务器上,首先是显而易见的:检查您的服务实现是否具有 @MTOM 注释。您还可以使用 threshold() 属性从此注释调整阈值(正如 SteveJ 已经提到的那样)。

有时服务器上的处理程序会干扰是否使用 MTOM 附件。任何将 SOAP 消息序列化为字符串或字节数组的处理程序(通常用于将消息内容写入日志的调试样式处理程序)将阻止使用 MTOM 附件。如果可能,请尝试禁用您的处理程序链并查看 MTOM 附件是否在此之后通过。

关于java - JAX-WS 始终内联发送 MTOM 附件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7202410/

相关文章:

java - 与其他依赖项的 hibernate-search-orm 冲突

java - 昂贵算法的 Clojure 性能

java - HTTP 状态 500 - servlet AxisServlet 的 Servlet.init() 抛出异常

web-services - 在可点击的 URI 链接中安全地传递用户和密码

java - 如何在 SoapUI JAX-WS 生成的代码中添加 ws-security

c# - 什么作为 Web 引用 (ASMX) 应该作为服务引用 (WCF),对吗?

java - CharacterData00.class java 中的 digit()

java - 从具有值的 fragment B 返回到 fragment A

c# - Service Fabric 单元测试和依赖项注入(inject)

python - 扭曲或 celery ?哪个适合我的具有大量 SOAP 调用的应用程序?