Клиент Apache CXF для динамических конечных точек - PullRequest
26 голосов
/ 11 июня 2010

Сейчас я использую Apache CXF в качестве клиента веб-служб для службы .NET, чтобы обойти проверку подлинности NTLM. Это прекрасно работает, но мне интересно, почему я не могу установить конечную точку веб-службы. CXF, кажется, хочет WSDL во время выполнения по какой-то странной причине - не уверен. Он берет физическую конечную точку из WSDL, которая, как я полагаю, прекрасно работает в тестовых средах, но во время развертывания она обязательно изменится.

Вот код для демонстрации:

        MyWebServices service = new MyWebServices ();
        MyWebServicesSoap port = service.getMyWebServicesSoap12();

        // Turn off chunking so that NTLM can occur
        Client client = ClientProxy.getClient(port);
        HTTPConduit http = (HTTPConduit) client.getConduit();
        HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
        httpClientPolicy.setConnectionTimeout(36000);
        httpClientPolicy.setAllowChunking(false);
        http.setClient(httpClientPolicy);

        port.doSomethingUseful();

Опять же, я не вижу места в клиентском API CXF, который бы позволял мне устанавливать конечную точку службы. Не то чтобы я все равно видел. В этом случае цель - http://localhost/integration/webservices/mywebservices.asmx,, но я могу быть где угодно. Наверняка эта пешеходная проблема решается как-то?

Ответы [ 2 ]

44 голосов
/ 11 июня 2010

Попробуйте следующее:

MyWebServicesSoap port = service.getMyWebServicesSoap12();
BindingProvider provider = (BindingProvider) port;
provider.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpoint); 

В качестве альтернативы, MyWebServices может иметь другие методы getXXX, которые принимают URL-адрес для расположения WSDL

11 голосов
/ 15 июня 2012

Работа в cxf 2.6.1

Client client = ClientProxy.getClient(port);
client.getRequestContext().put(Message.ENDPOINT_ADDRESS, "http://some-valid-endpoint") ;
...