Как использовать веб-службу WCF Soap 1.2 с помощью клиента веб-службы CXF? - PullRequest
2 голосов
/ 18 января 2011

Кто-нибудь знает хитрость вызова веб-службы WCF (Soap 1.2) из ​​CXF?

Я уже некоторое время пытаюсь заставить базового клиента hello world работать, и мне не повезло.

Отлично работает с Soap 1.1.

Когда я распечатываю SoapBinding, клиент использует его, используя soap 1.1, даже если это сервис soap 1.2 когда я устанавливаю привязку мыла вручную к 1.2, она зависает при вызове веб-службы и в конечном итоге умирает с исключением времени ожидания сокета (тайм-аут чтения).

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: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 голосов
/ 07 июля 2017

Я думаю, что вашей основной проблемой связи между WCF и CXF является отсутствие заголовков ws-адресации, присутствующих в запросе.Когда вы включаете wsHttpBinding, WCF ожидает клиента, который понимает ws-адресацию.Это особенность CXF, но должна быть включена.Следующий код должен решить ваши проблемы:

// add the ws-addressing feature on the proxy factory.
factory.getFeatures().add(new org.apache.cxf.ws.addressing.WSAddressingFeature());

Это решение работает с CXF 3.x.

0 голосов
/ 25 января 2011

Я на самом деле обнаружил, что CXF не поддерживает вызов службы Soap 1.2 WCF, которая использует wsHttpBinding. Я переключил веб-сервис WCF на использование BasicHttpBinding, и теперь он работает.

...