简短描述
我正在使用 JBoss SwitchYard 以连接到安全的远程 SOAP Web 服务。由于某种原因发送请求后;远程 Web 服务正在停止任何进一步的通信;所以我没有收到回复。
问题
我需要一个想法或解决方案,这可能是这里的问题。
错误
Caused by: java.net.SocketException: SocketException invoking https://**********.asmx: Unexpected end of file from server
描述和注释
- 远程网络服务正在使用自签名证书;我已将服务器证书导入到我的本地信任库 + 加上我的其他证书(在我的 keystore 中)以向远程服务器标识我自己。
- 感谢 -Djavax.net.debug=all SSL 调试日志和 Wireshark 日志,我知道客户端和服务器都成功进行了 SSL 握手并且客户端已成功发送一个请求。
- 服务器还使用 IP 过滤来允许直接通信,我的 IP 已列入白名单。
- 如果我尝试通过 SoapUI 发送相同的 XML 请求,它工作正常并且我收到响应。您应该考虑到 SoapUI 仅使用 keystore ;它设置为始终信任远程服务,因此不需要或不使用信任库。
- 有趣的部分来了。如果我使用 Fiddler(免费网络调试代理)作为我的 JBoss SwitchYard 和远程网络服务(查看发生了什么)之间的“中间人”,突然一切正常。
- 直接连接和使用 Fiddler 作为代理之间的唯一区别是,在实际连接中使用 Connection = Keep-Alive header 参数,而在 Fiddler 情况下,Proxy-Connection = Keep-Alive 参数被使用。我不知道是否还有其他显着差异。
- 如果我在 SoapUI 中手动更改这些 header 参数,我仍然会收到成功的响应。仅当我缺少 SOAPAction 和 Content-Type header 参数时,连接才会失败,但它们在每种情况下都存在(并且相同)。
- 当我通过 Wireshark 观察此通信时,我唯一能看到的区别是远程服务器正在停止进一步通信(当 JBoss Switchyard 应用程序直接与远程 Web 服务通信时) .
- 我无权访问远程日志,也无权获取它们。所以我在盲目工作。
- 在每种情况下(使用或不使用 Fiddler)我都使用公司代理来访问远程网络服务。此代理不是问题,因为其他 SwitchYard 应用程序运行良好。
工具
- JBoss EAP 6.4
- JBoss SwitchYard 2.0.1.redhat-621159
最佳答案
异常
java.net.SocketException: Unexpected end of file from server
这个异常意味着服务器已经接受了你的连接,这意味着你的 SSL 握手确实成功了。但是服务器在您获得响应之前关闭了连接(通过 TCP 重置或 fin)。
重置通常在两种情况下发送:
- 持久连接(keep alive connection)配置超过
- 服务器重启失去连接
通常,一个持久连接有两个配置:
Keep-Alive: timeout=15, max=100
timeout
表示时间(以秒为单位),max
表示最大请求数。
连接与代理连接
让我们比较一下您描述的三种不同情况:
- SoapUI:成功; ?
- 直接连接:失败;连接=保持 Activity
- fiddler :成功;代理连接=保持 Activity
第三种情况,如果我没理解错的话,你的持久连接是从客户端到代理,从代理到服务器不清楚。
client----->Proxy----->server
建议
- 尝试从响应中获取服务器的长连接配置(如here),查看直连是否超过限制的时间或数量
- 尽量不要使用持久连接:
java -Dhttp.keepalive=false
引用
关于java - 远程 SOAP Web 服务不断断开连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43974784/