有没有人知道从CXF调用WCF(Soap 1.2)Web服务的技巧?
我一直试图让一个基本的hello world客户端工作一段时间,但我没有运气。
它适用于Soap 1.1。
当我打印出SoapBinding时,客户端正在使用它使用soap 1.1,即使它是一个soap 1.2服务 当我手动将soap绑定设置为1.2时,它会在您进行Web服务调用时冻结并最终因套接字超时异常(读取超时)而死亡。
public static void main(String[] args) {
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(ITest.class);
factory.setAddress("http://localhost/Test/test.svc");
final Soap12 soap12 = Soap12.getInstance();
BindingConfiguration config = new BindingConfiguration() {
@Override
public String getBindingId() {
return soap12.getBindingId();
}
};
factory.setBindingConfig(config);
factory.setBindingId(soap12.getBindingId());
ITest service = (ITest) factory.create();
org.apache.cxf.endpoint.Client client = ClientProxy.getClient(service);
client.getRequestContext().put("ContentType", "text/xml; charset=utf-8");
SoapBinding binding = (SoapBinding) client.getEndpoint().getBinding();
System.out.println("[" + binding.getSoapVersion() + "]");
System.out.println(service.test("World"));
}
这是发送到WCF服务的soap请求。
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Body>
<Test xmlns="http://tempuri.org/" xmlns:ns2="http://schemas.microsoft.com/2003/10/Serialization/">
<s>World</s>
</Test>
</soap:Body>
</soap:Envelope>
答案 0 :(得分:0)
我实际上发现CXF不支持调用使用wsHttpBinding的Soap 1.2 WCF服务。我将WCF Web服务切换为使用BasicHttpBinding,现在可以正常工作。
答案 1 :(得分:0)
我认为WCF和CXF之间通信的主要问题是请求中缺少ws-addressing头。启用wsHttpBinding时,WCF需要一个了解ws-addressing的客户端。这是CXF的一项功能,但需要启用。以下代码应解决您的问题:
// add the ws-addressing feature on the proxy factory.
factory.getFeatures().add(new org.apache.cxf.ws.addressing.WSAddressingFeature());
此解决方案适用于CXF 3.x。