Я сгенерировал клиент веб-сервиса с локальным wsdl, используя Metro 1.2 следующим образом:
./wsimport.sh -extension -verbose -wsdllocation service.wsdl -s src -d target service.wsdl -Xendorsed
WSDL использует SOAP 1.2
и wsHttpBinding
. Он должен подключаться к серверу WCF, который использует NTLM
в качестве метода аутентификации.
Я создал Authenticator
для обработки NTLM
аутентификации:
public class NtlmAuthenticator extends Authenticator
{
private String username = "";
private String password = "";
public NtlmAuthenticator(String username, String password) {
this.username = username;
this.password = password;
}
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password.toCharArray());
}
}
Который я устанавливаю перед каждым методом веб-сервиса:
@WebEndpoint(name = "WSHttpBinding_ICustomerService")
public ICustomerService getWSHttpBindingICustomerService() {
ICustomerService service =
super.getPort(new QName("http://xmlns.example.com/services/Customer",
"WSHttpBinding_ICustomerService"), ICustomerService.class);
NtlmAuthenticator auth = new NtlmAuthenticator(username, password);
Authenticator.setDefault(auth);
return service;
}
Если я использую неправильное имя пользователя / пароль, я получаю обратно 401 Unauthorized
, что вполне нормально, но когда я использую правильное имя пользователя / пароль, вызов зависает, и я никогда не получаю ответ!
Запрос выглядит следующим образом (перехвачен с помощью netcat, поэтому хост отличается, и нет https):
POST / HTTP/1.1
Content-type: application/soap+xml;charset="utf-8";action="http://xmlns.example.com/services/ICustomerService/GetCustomer"
Password: [password]
Authorization: Basic [auth]
Username: [username]
Accept: application/soap+xml, multipart/related, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
User-Agent: JAX-WS RI 2.1.7-b01-
Cache-Control: no-cache
Pragma: no-cache
Host: localhost:5500
Connection: keep-alive
Content-Length: 603
[xml follows]
Я также пытался с wget 1.12
(слышал, что у 1.11 была проблема с NTLM), но он тоже никогда не дает ответа, просто ждет.
[...]
---request end---
[writing POST file customerRequest.xml ... done]
HTTP request sent, awaiting response...
Я видел, что другие уже сталкивались с таким поведением, но я не смог выяснить, почему. Может кто-нибудь пролить некоторый свет на это? JDK 1.6 на Linux.