Ale*_*exS 10 java client soap web-services 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);
Run Code Online (Sandbox Code Playgroud)
我得到的是我的附件是内联发送,如下所示.(用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
Run Code Online (Sandbox Code Playgroud)
我想要的是结果标记中的附件被替换为内联标记和附加到不同mime部分中的soap消息的附件.例如
<result xmime:contentType='application/doc'>
<inc:Include href="cid:myid3" xmlns:inc='http://www.w3.org/2004/08/xop/include'/>
</result>
Run Code Online (Sandbox Code Playgroud)
然后以下内容添加到soap消息中
------=_Part_10_28027205.1314348995670
Content-Type: application/pdf
Content-Transfer-Encoding: binary
Content-ID: cid:myid3
Content-Disposition: attachment; name="mypdf.pdf"
JVBERi0xLjQKJaqrrK0KNCAwIG9iago8
Run Code Online (Sandbox Code Playgroud)
许多因素都会影响 MTOM 附件是否实际使用。
在服务器上,首先是显而易见的事情:检查您的服务实现是否具有注释@MTOM。您还可以使用该属性调整此注释的阈值(正如 SteveJ 已经提到的)threshold()。
有时,服务器上的处理程序可能会干扰是否使用 MTOM 附件。任何将 SOAP 消息序列化为字符串或字节数组的处理程序(常见于将消息内容写入日志的调试样式处理程序)将阻止使用 MTOM 附件。如果可能,请尝试禁用处理程序链并查看 MTOM 附件之后是否可以通过。
| 归档时间: |
|
| 查看次数: |
6447 次 |
| 最近记录: |