Java 远程SOAP web服务不断中断连接 简短描述
我正在使用连接到安全的远程SOAP web服务。在发送请求后出于某种原因;远程web服务正在停止任何进一步的通信;所以我没有收到回复 问题: 我需要一个想法或解决方案,这可能是一个问题 错误 原因:java.net.SocketException:SocketException调用https://***********.asmx:服务器文件意外结束 说明及注释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+中,并且我还有其他证书(在密钥库中)用于向远程服务器标
- 远程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中手动更改这些标题参数,我仍然会收到成功的响应。只有当我缺少SOAPAction和Content Type标题参数时,连接才会失败,但它们在每种情况下都存在(并且是相同的)
- 当我通过Wireshark观察此通信时,我能看到的唯一区别是远程服务器正在停止进一步的通信(当JBoss开关站应用程序直接与远程web服务通信时)
- 我无法访问远程日志,也不允许获取它们。所以我在瞎干活
- 在每种情况下(有或没有Fiddler),我都使用公司代理来访问远程web服务。此代理不是问题,因为其他开关站应用程序工作正常
- JBoss EAP 6.4
- JBoss开关站2.0.1.redhat-621159
- 使用配置的持久连接(保持活动连接)
- 重新启动的服务器丢失了连接
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();
}
}
}
}