2
votes

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

1 Answers

1
votes

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