Java 远程SOAP web服务不断中断连接 简短描述

Java 远程SOAP web服务不断中断连接 简短描述,java,web-services,fiddler,jboss-eap-6,switchyard,Java,Web Services,Fiddler,Jboss Eap 6,Switchyard,我正在使用连接到安全的远程SOAP web服务。在发送请求后出于某种原因;远程web服务正在停止任何进一步的通信;所以我没有收到回复 问题: 我需要一个想法或解决方案,这可能是一个问题 错误 原因:java.net.SocketException:SocketException调用https://***********.asmx:服务器文件意外结束 说明及注释 远程web服务正在使用自签名证书;我已将服务器证书导入本地truststore+中,并且我还有其他证书(在密钥库中)用于向远程服务器标

我正在使用连接到安全的远程SOAP web服务。在发送请求后出于某种原因;远程web服务正在停止任何进一步的通信;所以我没有收到回复

问题: 我需要一个想法或解决方案,这可能是一个问题

错误 原因:java.net.SocketException:SocketException调用https://***********.asmx:服务器文件意外结束

说明及注释
  • 远程web服务正在使用自签名证书;我已将服务器证书导入本地truststore+中,并且我还有其他证书(在密钥库中)用于向远程服务器标识我自己
  • 多亏了-Djavax.net.debug=allSSL调试日志和Wireshark日志,我知道客户端和服务器都成功地进行了SSL握手,客户端也成功地发送了请求
  • 服务器还使用IP过滤来允许直接通信,我的IP被列入白名单
  • 如果我尝试通过SoapUI发送相同的XML请求,它工作正常,我会收到一个响应。您应该考虑到SoapUI只使用密钥库;它设置为始终信任远程服务,因此不需要或使用truststore
  • 现在是有趣的部分。如果我使用一个Fiddler(免费web调试代理)作为我的JBoss开关站和远程web服务之间的“中间人”(看看发生了什么),突然一切都正常了
  • 直接连接和使用Fiddler作为代理的唯一区别在于,在实际连接中,使用connection=Keep-Alive头参数,在Fiddler情况下,使用proxy-connection=Keep-Alive参数。我不知道还有没有其他显著的区别
  • 如果我在SoapUI中手动更改这些标题参数,我仍然会收到成功的响应。只有当我缺少SOAPActionContent Type标题参数时,连接才会失败,但它们在每种情况下都存在(并且是相同的)
  • 当我通过Wireshark观察此通信时,我能看到的唯一区别是远程服务器正在停止进一步的通信(当JBoss开关站应用程序直接与远程web服务通信时)
  • 我无法访问远程日志,也不允许获取它们。所以我在瞎干活
  • 在每种情况下(有或没有Fiddler),我都使用公司代理来访问远程web服务。此代理不是问题,因为其他开关站应用程序工作正常
工具
  • JBoss EAP 6.4
  • JBoss开关站2.0.1.redhat-621159
例外 java.net.SocketException:来自服务器的文件意外结束

此异常意味着服务器已接受您的连接,这意味着您的SSL握手确实成功。但是在您获得响应之前,服务器(通过TCP重置或fin)关闭了连接

重置通常在两种情况下发送:

  • 使用配置的持久连接(保持活动连接)
  • 重新启动的服务器丢失了连接
通常,持久连接有两种配置:

Keep-Alive: timeout=15, max=100
timeout
表示以秒为单位的时间,
max
表示最大请求数

连接与代理连接 让我们比较一下您描述的三种不同情况:

  • SoapUI:成功
  • 直接连接:失败;连接=保持活动状态
  • 小提琴手:成功;代理连接=保持活动状态
在第三种情况下,如果我理解正确的话,您的持久连接是从客户端到代理,而从代理到服务器则不清楚

 client----->Proxy----->server
建议
  • 尝试从响应(like)获取服务器的持久连接配置,以查看直接连接是否超过了时间或数量限制
  • 尽量不要使用持久连接:
    java-Dhttp.keepalive=false
裁判

    • 问题可能是由于SOAP请求的头无效或格式无效,您可以尝试以下代码

      1您需要HeaderHandlerResolver

       public class HeaderHandlerResolver implements HandlerResolver {
      
              public List<Handler> getHandlerChain(PortInfo portInfo) {
                  List<Handler> handlerChain = new ArrayList<Handler>();
      
                  HeaderHandler hh = new HeaderHandler();
      
                  handlerChain.add(hh);
      
                  return handlerChain;
              }
          }
      
      另外,确保您从wsdl文件生成的代码是最新的,并且服务器位置url也是正确的


      希望它能解决您的问题

      http级别的传输编码是什么?我在使用具有类似效果的分块编码(虽然没有ssl)时遇到一些问题。您是否尝试更改加密协议和/或密码?能否共享可用的日志和Wireshark捕获?远程服务是否在Azure上?如果是,请参见此问题:
       public class HeaderHandler implements SOAPHandler<SOAPMessageContext> {
      
              public boolean handleMessage(SOAPMessageContext smc) {
      
                  Boolean outboundProperty = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
      
                  if (outboundProperty.booleanValue()) {
      
                      SOAPMessage message = smc.getMessage();
      
                      try {
      
                          SOAPEnvelope envelope = smc.getMessage().getSOAPPart().getEnvelope();
      
                          SOAPHeader header = envelope.getHeader();
                          header.setPrefix("soapenv");
                          header.setAttribute("xmlns:wsa", "http://www.w3.org/2005/08/addressing");
      
                          SOAPElement security =
                                  header.addChildElement("Security", "wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
      
                          SOAPElement usernameToken =
                                  security.addChildElement("UsernameToken", "wsse");
                          usernameToken.addAttribute(new QName("xmlns:wsu"), "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
      
                          SOAPElement username =
                                  usernameToken.addChildElement("Username", "wsse");
                          username.addTextNode("USERNAME");
      
                          SOAPElement password =
                                  usernameToken.addChildElement("Password", "wsse");
                          password.setAttribute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");
                          password.addTextNode("PASSWORD");
      
                          SOAPElement encode =
                                  usernameToken.addChildElement("Nonce", "wsse");
                          encode.setAttribute("EncodingType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary");
                          encode.addTextNode(generateNonce());
      
                          Calendar createdTime = new GregorianCalendar(TimeZone.getTimeZone("IST"));
                          Date todayDate = createdTime.getTime();
                          todayDate.setTime(todayDate.getTime()-20000000);
      
                          SOAPElement created = usernameToken.addChildElement("Created", "wsu");
                          created.addTextNode(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.sss'Z'").format(todayDate));
      
                          SOAPElement action = header.addChildElement("Action", "wsa");
                          //YOUR ACTION URL SHOULD BE in BELOW Text Content
                          action.setTextContent("SET HERE YOUR ACTION URL");
      
                          message.saveChanges();
                          message.writeTo(System.out);
                          System.out.println("");
      
                      } catch (Exception e) {
                          e.printStackTrace();
                      }
      
                  } else {
                      try {
      
                          //This handler does nothing with the response from the Web Service so
                          //we just print out the SOAP message.
                          SOAPMessage message = smc.getMessage();
                          message.writeTo(System.out);
                          System.out.println("");
                      } catch (Exception ex) {
                          ex.printStackTrace();
                      }
                  }
      
      
                  return outboundProperty;
      
              }
      
              public Set getHeaders() {
                  return null;
              }
      
              public boolean handleFault(SOAPMessageContext context) {
                  return true;
              }
      
              public void close(MessageContext context) {
              }
      
              private static String generateNonce() throws NoSuchAlgorithmException, NoSuchProviderException, UnsupportedEncodingException {
                  String dateTimeString = Long.toString(new Date().getTime());
                  byte[] nonceByte = dateTimeString.getBytes();
                  return Base64.encodeBase64String(nonceByte);
              }
          }
      
      public class SoapClientClass {
      
          public static void main(String[] args) {
      
              ImplService service = new ImplService();
              HeaderHandlerResolver handlerResolver = new HeaderHandlerResolver();
              service.setHandlerResolver(handlerResolver);
      
              ResponseClass port = service.getPortClass();
      
              Response response = null;
              try {
                  response = port.getServerMehotd("Params");
              } catch (PolicyException_Exception e) {
                  e.printStackTrace();
              } catch (ServiceException_Exception e) {
                  e.printStackTrace();
              }
      
              }
          }
      }