SOAP 连接重置

SOAP Connection Reset

我成功使用 weimport maven 工具生成了针对客户端 WSD 的 Jar 文件,它由 .net SOAP 服务支持

当我从 java 客户端代码发出请求时,我收到以下日志

Accept: text/xml, multipart/related
Content-Type: multipart/related;start="<rootpart*dbea05e3-9997-4835-965c-02b1ed77e6b6@example.jaxws.sun.com>";type="application/xop+xml";boundary="uuid:dbea05e3-9997-4835-965c-02b1ed77e6b6";start-info="text/xml"
SOAPAction: "http://xxx/2013/xxx/RemotexxxService/UpdateProfile"
User-Agent: JAX-WS RI 2.2.10 svn-revision#919b322c92f13ad085a933e8dd6dd35d4947364b
--uuid:dbea05e3-9997-4835-965c-02b1ed77e6b6
Content-Id: <rootpart*dbea05e3-9997-4835-965c-02b1ed77e6b6@example.jaxws.sun.com>
Content-Type: application/xop+xml;charset=utf-8;type="text/xml"
Content-Transfer-Encoding: binary

我收到以下错误

javax.xml.ws.WebServiceException: java.net.SocketException: Connection reset
    at com.sun.xml.ws.transport.http.client.HttpClientTransport.readResponseCodeAndMessage(HttpClientTransport.java:210)
    at com.sun.xml.ws.transport.http.client.HttpTransportPipe.createResponsePacket(HttpTransportPipe.java:241)
    at com.sun.xml.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:232)
    at com.sun.xml.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:145)
    at com.sun.xml.ws.transport.DeferredTransportPipe.processRequest(DeferredTransportPipe.java:110)
    at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:1136)
    at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:1050)
    at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:1019)
    at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:877)
    at com.sun.xml.ws.client.Stub.process(Stub.java:463)
    at com.sun.xml.ws.client.sei.SEIStub.doProcess(SEIStub.java:191)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:108)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:92)
    at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:161)

然而,当我复制整个 SOAP 消息并在 SOAPUI 中尝试时,它确实有效..

我注意到 SOAP UI 生成了不同的 http header

POST http://coreservices-uat.legendonlineservices.co.uk/IRemoteContactUpdateService.svc HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: text/xml;charset=UTF-8
SOAPAction: "http://Infrastructure/2013/ContactPhoto/RemoteContactUpdateService/UpdateProfile"
Content-Length: 1761
Host: coreservices-uat.legendonlineservices.co.uk
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)

我认为 Java 版本或 Apache-Httpclient 或 Jasws 实现之间的差异不会产生任何差异

难道是Content-Type?我的意思是在 SOAP UI 中 content-type 是 不同于 Java 客户端

会不会是wsdl中的以下定义导致了问题?

<wsp:Policy wsu:Id="BasicHttpBinding_RemoteContactUpdateService_policy">
<wsp:ExactlyOne>
<wsp:All>
<wsoma:OptimizedMimeSerialization xmlns:wsoma="http://schemas.xmlsoap.org/ws/2004/09/policy/optimizedmimeserialization"/>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>

注意:几天前,我使用相同的 Java 代码向服务器发送了相同的 XML 消息,它总是有效....这是最近的错误。

在我的案例中,网络服务提供商将端点从 https 更改为 http 服务器端的 https 连接器也被禁用

在我的案例中,通过 http 发送 MTOM 显然导致了问题

解决方法是从我的 JAXWS 客户端禁用 MTOM

Binding binding = bp.getBinding();
SOAPBinding sb = (SOAPBinding)binding;
sb.setMTOMEnabled(false);

此后,客户端请求的内容类型从

Content-Type: multipart/related;start="<rootpart*dbea05e3-9997-4835-965c-02b1ed77e6b6@example.jaxws.sun.com>";type="application/xop+xml";boundary="uuid:dbea05e3-9997-4835-965c-02b1ed77e6b6";start-info="text/xml"
Content-Type: application/xop+xml;charset=utf-8;type="text/xml"

Content-Type: text/xml;charset=UTF-8

然后我通过 http 发送它,问题解决了。