如何使用CXF Web服务客户端使用WCF Soap 1.2 Web服务?

时间:2011-01-18 15:29:15

标签: wcf web-services soap cxf

有没有人知道从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>

2 个答案:

答案 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。