我正在从Web服务客户端(代码由IBM RAD 7.5生成)向主机发送SOAP消息,并且它带有Web服务错误,并且主机日志中的消息显示为“prolog中不允许的内容” 。当我使用SoapUI或简单的apache HttpClient测试客户端发送相同的内容时,主机会收到并处理该消息,并得到预期的响应。
据我所知,区别在于正在发送的HTTP标头。
RAD生成的客户端:
POST /ws/mycompany/webservice/SomeWebServiceName/soap11 HTTP/1.1 Host: http://host.com/ws/mycompany/webservice/SomeWebServiceName/soap11 Accept: application/soap+xml,multipart/related,text/* User-Agent: IBM WebServices/1.0 Cache-Control: no-cache Pragma: no-cache SOAPAction: "" Connection: Keep-Alive SAVECONNECTION: 7814631881345232300226 IBM-WAS-CLIENT: TRUE Content-Type: multipart/related; boundary=MIMEBoundaryurn_uuid_E54EE0B5F8ED486B811345232300773; type="application/xop+xml"; start=""; start-info="text/xml" Content-Length: 2553 Date: Fri, 17 Aug 2012 19:38:20 GMT --MIMEBoundaryurn_uuid_E54EE0B5F8ED486B811345232300773 Content-Type: application/xop+xml; charset=UTF-8; type="text/xml" Content-Transfer-Encoding: binary Content-ID: <soapenv:Envelope... --MIMEBoundaryurn_uuid_E54EE0B5F8ED486B811345232300773--
对于SoapUI:
POST /ws/mycompany/webservice/SomeWebServiceName/soap11 HTTP/1.1 Accept-Encoding: gzip,deflate Content-Type: text/xml;charset=UTF-8 SOAPAction: "" Content-Length: 2732 Host: localhost:9111 Connection: Keep-Alive User-Agent: Apache-HttpClient/4.1.1 (java 1.5) <soapenv:Envelope...
使用apache HttpClient实现一个非常简单的客户端:
POST /ws/mycompany/webservice/SomeWebServiceName/soap11 HTTP/1.1 User-Agent: Jakarta Commons-HttpClient/3.1 Transfer-Encoding: chunked Host: localhost:9111 8da <soapenv:Envelope... 0
据我所知,这三者之间的区别在于RAD生成的客户端生成的请求具有内容类型“multipart”并定义了MIME边界。我无法访问主机系统,但似乎主机无法处理多部分消息。
有没有办法强制IBM客户端代码像SoapUI或HttpClient一样发送消息?
答案 0 :(得分:1)
看起来问题是在BindingProvider中将MTOM设置为true
。
我将代码更改为:
SOAPBinding soapBinding = (SOAPBinding) bindProvider.getBinding();
soapBinding.setMTOMEnabled(false);
一切都很好。我认为MTOM设置为true
,因为应用程序中的其他客户端需要它,并且此代码看起来像是基于其他客户端的代码。由于此Web服务调用实际上不需要MTOM,因此将其关闭是没有问题的。