问题
I am sending a SOAP message from a webservice client (code was generated by IBM RAD 7.5) to a host, and it with a webservice fault and a message that in the hosts' log reads as "content not allowed in prolog". When I send the same content with SoapUI or a simple apache HttpClient test client, the message is received and processed by the host, and I get the expected response.
As far as I can tell, the difference is in the HTTP headers that are being sent.
RAD-generated client:
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--
For 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...
And a very simple client implemented using 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
As far as I can tell, the difference between these three is that the request generated by by the RAD-generated client has a content-type "multipart" and defines a MIME boundary. I don't have access to the host system but it seems that the host is not able to handle multipart messages.
Is there a way to force the IBM client code to send the message as simply as SoapUI or the HttpClient?
回答1:
It looks like the problem was setting MTOM to true
in the BindingProvider.
I changed my code to this:
SOAPBinding soapBinding = (SOAPBinding) bindProvider.getBinding();
soapBinding.setMTOMEnabled(false);
And everything worked fine. I think MTOM was set to true
because other clients in the application needed it and this code looks like it was based on the other clients' code. Since this web service call doesn't actually need MTOM, turning it off was no problem.
Also, see: http://pic.dhe.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=%2Fcom.ibm.websphere.wsfep.multiplatform.doc%2Finfo%2Fae%2Fae%2Ftwbs_enablemtom.html
来源:https://stackoverflow.com/questions/12043991/prevent-a-soap-message-from-being-sent-with-content-type-as-multipart-related