在 Windows Phone 8.1 上使用 Sharepoint REST API 时,HttpClient 无法通过 NTLM 对第二个请求进行身份验证

2023-12-02

很抱歉标题很长,但这似乎是迄今为止我所知道的最好的总结。

我们目前正在开发一个通用应用程序,该应用程序需要使用 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, 有用。

因此,虽然我很高兴我至少找到了一些让它发挥作用的方法,但我真的很想知道这个组合有什么特别之处,以及可以做些什么来让它发挥作用?


嗨丹尼尔,当我进行同步时遇到同样的问题,因为 Windows Phone 有很多缓存问题,最后我可以通过添加标头来解决。 另外我认为使用超时是个好主意,因为这是一个很长的响应,您可以等待很长时间......而另一个好的工作方法是使用“using”,它与使用“.Dispose()”类似。现在我向您展示代码:

 var request3 = WebRequest.CreateHttp(url);
 request3.Credentials = credentials;
 request.ContinueTimeout = 4000; //4 seconds

 //For solve cache problems
 request.Headers["Cache-Control"] = "no-cache";
 request.Headers["Pragma"] = "no-cache";

 using(httpWebResponse response3 = (httpWebResponse) await request3.GetResponseAsync()){
      if (response3.StatusCode == HttpStatusCode.OK)
      {
          //Your code...
      }
 }

 var request4 = WebRequest.CreateHttp(url);
 request4.Credentials = credentials;
 request.ContinueTimeout = 4000; //4 seconds

 //For solve cache problems
 request.Headers["Cache-Control"] = "no-cache";
 request.Headers["Pragma"] = "no-cache";

 using(httpWebResponse response4 = (httpWebResponse) await request4.GetResponseAsync()){
      if (response4.StatusCode == HttpStatusCode.OK)
      {
          //Your code...
      }
 }

我等待我的代码可以帮助你。谢谢,祝你好运!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Windows Phone 8.1 上使用 Sharepoint REST API 时,HttpClient 无法通过 NTLM 对第二个请求进行身份验证 的相关文章

随机推荐