2016-05-11 2 views
0

Я пытаюсь вызвать веб-сервис (разработанный на C#) с использованием JAX-WS, поверх https. Я попытался настроить вызов через SoapUI, и это работает.Jax-ws с https url заканчивается как http

Но, пытаясь сделать то же самое через сгенерированный клиент jax-ws, все, что я получаю, - это ответ 301. Это похоже на то, что я получаю с помощью SoapUI с http-url для одной и той же службы, а также wirehark сообщает мне, что я выполняю HTTP-процедуру HTTP (HTTP/XML) POST. Это приводит меня к убеждению, что по какой-то причине мой сгенерированный клиент JAX-WS пытается вызвать через http вместо https.

Examplified код:

new MyServiceInterface(new URL("https://acme.com/services/MyService.svc?wsdl")) 
         .getMyPort().test(); 

Как вы можете видеть, я поставить https URL при создании моего клиента. Есть ли что-то еще, чтобы убедиться, что JAX-WS использует https? URI пространства имен - все http, может ли это вызвать проблемы?

Update:

я реализовал SOAP-запрос на обслуживание в quesiton, используя руководство от принятого ответа здесь: Working Soap client example Довольно много повторяется информация из SoapUI, и теперь он дает мне надлежащую 200 ответ.

Update 2:

При отладке мой JAX-WS-клиент, я нахожу это свойство:

"javax.xml.ws.service.endpoint.address" -> "http://acme.com/services/MyService.svc" 

Это имеет HTTP, а не HTTPS. Соответствующий?

Update 3:

При использовании отладчика изменить "javax.xml.ws.service.endpoint.address" на HTTPS URL, а не HTTP, мой клиент работает. Но с чего это связано?

+0

Выглядит как вопрос на стороне сервера. Попробуйте, если вы можете получить доступ к серверу на порту 443. – Stefan

+0

Так как SoaPUI работает, я думаю, сервер работает так же хорошо? – Tobb

ответ

4

Одна из причин может быть, если WSDL ссылается на URL-адрес http.

новый MyServiceInterface (новый URL ("https://acme.com/services/MyService.svc?wsdl")) .getMyPort() тест().

Я хотел бы предложить скачивание https://acme.com/services/MyService.svc?wsdl и глядя на <address> или конечной точке в пределах <service>. Если это выглядит следующим образом:

<soap:address location="http://acme.com/services/MyService.svc"/> 

Это может объяснить то, что вы видите в javax.xml.ws.service.endpoint.address.

Если это так, и вы не можете контролировать/исправить удаленный WSDL, может потребоваться программно переопределить конечную точку:

MyServicePort myPort = new MyServiceInterface(new URL("https://acme.com/services/MyService.svc?wsdl")).getMyPort(); 
// set endpoint to use https 
String endpointURL = "https://acme.com/services/MyService.svc"; 
BindingProvider bp = (BindingProvider) myPort; 
bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointURL); 
myPort.test(); 
+0

Я проверю это, и в качестве примечания я получил его, установив свойство вручную. Просто чтобы перейти к следующей проблеме (конечно), с jax-b, генерирующим xml с неправильным именем. Meh, жизнь как разработчик: p – Tobb

+0

Проверял WSDL, и вы правы, адресный элемент внутри служебного элемента имеет URL-адрес http.Может ли это называться ошибкой? Или это просто, как все делается в .NET-созданных wsdls? – Tobb