我正在尝试向SOAP请求添加自定义命名空间声明,更具体地说:
env.addNamespaceDeclaration("soapenv", "http://www.w3.org/2003/05/soap-envelope");
我在SOAP消息处理程序中执行此操作,根据我使用的Web服务的规范,此命名空间声明是绝对必需的。但是,jax ws库似乎总是在发送消息之前尝试添加此soapenv命名空间声明,然后失败如下:
Exception in thread "main" javax.xml.ws.WebServiceException: javax.xml.stream.XMLStreamException: prefix soapenv has been already bound to http://www.w3.org/2003/05/soap-envelope. Rebinding it to http://schemas.xmlsoap.org/soap/envelope/ is an error
at com.sun.xml.internal.ws.encoding.StreamSOAPCodec.encode(StreamSOAPCodec.java:101)
at com.sun.xml.internal.ws.encoding.SOAPBindingCodec.encode(SOAPBindingCodec.java:267)
at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:196)
at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:122)
at com.sun.xml.internal.ws.transport.DeferredTransportPipe.processRequest(DeferredTransportPipe.java:95)
at com.sun.xml.internal.ws.api.pipe.Fiber.__doRun(Fiber.java:626)
at com.sun.xml.internal.ws.api.pipe.Fiber._doRun(Fiber.java:585)
at com.sun.xml.internal.ws.api.pipe.Fiber.doRun(Fiber.java:570)
at com.sun.xml.internal.ws.api.pipe.Fiber.runSync(Fiber.java:467)
at com.sun.xml.internal.ws.client.Stub.process(Stub.java:308)
at com.sun.xml.internal.ws.client.sei.SEIStub.doProcess(SEIStub.java:163)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:98)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:78)
at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:135)
at com.sun.proxy.$Proxy32.getAccountBalance(Unknown Source)
at XXXX.ClientTest.getAccountData(ClientTest.java:60)
at XXXX.ClientTest.<init>(ClientTest.java:55)
at XXXX.ClientTest.main(ClientTest.java:30)
Caused by: javax.xml.stream.XMLStreamException: prefix soapenv has been already bound to http://www.w3.org/2003/05/soIIap-envelope. Rebinding it to http://schemas.xmlsoap.org/soap/envelope/ is an error
at com.sun.xml.internal.stream.writers.XMLStreamWriterImpl.writeNamespace(XMLStreamWriterImpl.java:1035)
at com.sun.xml.internal.ws.util.DOMUtil.writeTagWithAttributes(DOMUtil.java:173)
at com.sun.xml.internal.ws.message.saaj.SAAJMessage.writeTo(SAAJMessage.java:341)
at com.sun.xml.internal.ws.encoding.StreamSOAPCodec.encode(StreamSOAPCodec.java:98)
... 17 more
HandleMessage函数:
public boolean handleMessage(SOAPMessageContext context) {
//Inquire incoming or outgoing message.
boolean outbound = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
try {
if (outbound) {
// OUTBOUND
System.out.println("Direction=outbound (handleMessage)");
SOAPMessage msg = ((SOAPMessageContext) context).getMessage();
// get SOAP-Part
SOAPPart sp = msg.getSOAPPart();
//edit Envelope
SOAPEnvelope env = sp.getEnvelope();
env.addNamespaceDeclaration("web", "http://example.com/webservices");
env.addNamespaceDeclaration("soapenv", "http://www.w3.org/2003/05/soap-envelope");
env.removeNamespaceDeclaration("S");
env.setPrefix("soapenv");
SOAPHeader soapHeader = env.addHeader();
SOAPBody soapBody = env.getBody();
soapHeader.setPrefix("soapenv");
soapBody.setPrefix("soapenv");
Name ticketHeaderName = env.createName("TicketHeader", "web",
"http://example.com/webservices");
SOAPElement ticketHeader = soapHeader.addChildElement(ticketHeaderName);
SOAPElement soapHeaderElem2 = ticketHeader.addChildElement("SessionId", "web");
soapHeaderElem2.addTextNode(sessionId);
msg.saveChanges();
// print SOAP-Message
dumpSOAPMessage(msg);
} else {
// INBOUND
System.out.println("Direction=inbound (handleMessage)");
SOAPMessage msg = ((SOAPMessageContext) context).getMessage();
dumpSOAPMessage(msg);
}
} catch (Exception e) {
//All other unhandled problems.
e.printStackTrace();
}
return true;
}
使用SOAP1.1规范时会发生此错误
<soapenv:Envelope xmlns:SOAPENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://saxobank.com/webservices/">
但是您尝试将名称空间设置为SOAP 1.2版本:
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" xmlns:web="http://saxobank.com/webservices/">
编写正确规格的请求为我解决了这个问题。
Hprose 远程过程调用(RPC)通讯可以在任何底层网络协议上传输。例如 HTTP,TCP 或 UNIX socket。 HTTP 绑定 当 hprose 远程过程调用(RPC)工作于 HTTP 之上时,hprose 远程过程调用(RPC)的数据作为 POST 请求的 body 部分发送,以响应的 body 部分返回。 Hprose 远程过程调用(RPC) 对 HTTP 的头部(head)没有任
我们在Glassfish v4上创建了一个网站,它使用8080端口作为http,8081端口作为https。我们的cisco防火墙将请求转发到端口80到端口8080,并将请求转发到端口443到端口8081。 但是我们不希望用户能够访问超文本传输协议网站。我们希望将所有请求重定向到超文本传输协议站点到https。怎么能做到呢?在Glassfish管理面板中,我们对配置进行了更改-
我正在使用GWT和Spring controller来管理http流量。有些请求可能需要很长时间,但我希望在超过给定时间时终止请求。 我如何配置超时Spring。我也使用Apache Tomcat 7.0。我试图在tomcat上inrease最大线程,但有一段时间tomcat工作缓慢,因为请求线程不会死。
我已经安装了Apache 2.2负载平衡器和Weblogic 12c服务器。 我观察到一个https URL试图在我的应用程序中打开一个http URL,但没有成功,正如预期的那样。我搜索了一下为什么这会导致问题,并注意到了一些问题- http://geekexplains.blogspot.in/2008/06/https-becoming-http-in-case-of.html 当我试图寻找
我只是有一个关于服务中http请求的结构和处理响应的问题。我正在使用Angular2。alpha46 Typescript(刚刚开始测试-我喜欢它…Ps…。感谢所有一直致力于它并通过github作出贡献的人) 因此,采取以下措施: 登录表单。组成部分ts 从这个组件中,我导入了我的userService,它将容纳我的超文本传输协议请求,以登录用户。 使用者服务ts 我想做的是能够处理http请求之
我的LogCat: 签名密钥(sw)为https://api.dropbox.com/1/shares/dropbox/a.jpg?oauth_consumer_key=2f2y1dyuqhp58ek 我对http没有太多经验。。 因为httpPost=新的httpPost(sw);工作正常,这是否意味着基本字符串签名正确? 还是我错过了什么?