我创建了一个基于 KSOAP-Android 和 JCIFS 的 NTLM 身份验证 SOAP 客户端。实现看起来像这样:
public class NtlmServiceConnection implements ServiceConnection
{
public NtlmServiceConnection(final SoapConnectionInfo connectionInfo, String path)
{
httpclient = new DefaultHttpClient();
httpclient.getAuthSchemes().register(AuthPolicy.NTLM, new NTLMSchemeFactory());
//...
@Override
public InputStream openInputStream() throws IOException {
ByteArrayEntity re = new ByteArrayEntity(bufferStream.toByteArray());
post.removeHeaders("CONTENT-LENGTH");
post.setEntity(re);
HttpResponse rep = httpclient.execute(post);
InputStream stream = rep.getEntity().getContent();
return stream;
}
//....
}
从外观上看,KSOAP 正在生成正确的消息,因为bufferStream
它按预期填充了 SOAP 信封。JCIFS 似乎正在完成它的工作,我可以看到 NTLM 挑战响应通过 Wireshark 进行。问题是缺少消息正文。它只是空的。因此,Web 服务遇到 501 并且InputStream
返回为空。
任何人都知道为什么会发生这种情况?
注意:我正在删除下面的 CONTENT-LENGTH 标头,因为setEntity
显然尝试设置它,但 KSOAP 已经设置它。我只是删除它并允许setEntity
重置它。