java - 远程 SOAP Web 服务不断断开连接

标签 java web-services fiddler jboss-eap-6 switchyard

简短描述

我正在使用 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 参数,我仍然会收到成功的响应。仅当我缺少 SOAPActionContent-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/

相关文章:

java - 带有智能卡 + 本地应用程序进行身份验证的 PHP 站点

java - 如何获取 Java 中 HashMap 的相同值多次出现的次数?

wcf - 使用Fiddler测试WCF REST服务时如何完成基本身份验证握手?

java - 使用 SwingWorker 的带有 GUI 的倒计时器 - 未正确更新

java - 不同语言中模运算符的差异

c# - ServiceStack token 身份验证

java - 我可以在 tomcat 3.3.1 上使用哪种 Web 服务引擎?

java - MySQL+Java webService+Android 客户端 : Is is better to make multiple queries or one big?

.net - 如何测试我的 .NET 客户端正在使用哪个版本的 TLS?

http - DNS 查找时间和 Windows DNS 缓存