很抱歉标题很长,但这似乎是迄今为止我所知道的最好的总结。
我们目前正在开发一个通用应用程序,该应用程序需要使用 NTLM 身份验证通过 REST API 访问 Sharepoint 服务器上的一些文档,事实证明这比应有的要困难。虽然我们能够找到所有问题的解决方法(见下文),但我并不真正理解发生了什么以及为什么它们是必要的。
不知何故HttpClient
类在手机和 PC 上的表现似乎有所不同。这是我到目前为止所想到的。
我从这段代码开始:
var credentials = new NetworkCredential(userName, password);
var handler = new HttpClientHandler()
{
Credentials = credentials
};
var client = new HttpClient(handler);
var response = await client.GetAsync(url);
这在 Windows 应用程序中工作正常,但在 Windows Phone 应用程序中失败。服务器只返回一个401 未经授权状态码。
Some research显示您需要提供一个域名NetworkCredential
class.
var credentials = new NetworkCredential(userName, password, domain);
这适用于两个平台。但为什么 Windows 上不需要域呢?
当您尝试执行多个请求时,会出现下一个问题:
var response1 = await client.GetAsync(url);
var response2 = await client.GetAsync(url);
同样,这在 Windows 应用程序中运行得很好。两个请求都成功返回:
再次,它在电话上失败了。第一个请求没有问题地返回:
奇怪的是,对同一资源的任何连续请求都会失败,状态代码再次为 401。
这个问题已经被遭遇 before,不过好像还没有解决办法。
第二个线程中的答案表明 NTLM 握手存在问题。但为什么只有第二次呢?
另外,这似乎是一个问题HttpClient
类,因为以下代码在两个平台上都可以正常工作:
var request3 = WebRequest.CreateHttp(url);
request3.Credentials = credentials;
var response3 = await request3.GetResponseAsync();
var request4 = WebRequest.CreateHttp(url);
request4.Credentials = credentials;
var response4 = await request4.GetResponseAsync();
所以问题才出现:
- 在 Windows Phone 上。 Windows 应用程序中的相同代码也可以工作。
- 连接到 Sharepoint 时。使用 NTLM 身份验证访问另一个站点在这两个平台上都有效。
- 使用时
HttpClient
. Using WebRequest
, 有用。
因此,虽然我很高兴我至少找到了一些让它发挥作用的方法,但我真的很想知道这个组合有什么特别之处,以及可以做些什么来让它发挥作用?