1

我们在少量工作站(Windows 7)上有一个奇怪的行为。我们的 .NET 客户端正在与 IIS 中托管的 REST Api 服务 (Web API 2) 进行通信。客户端使用 System.Net.Http.HttpClient 访问 Api,并针对 .NET Framework 4.5.2。Api 配置为使用 Windows 集成身份验证(协商、NTLM)。

当客户端使用 HTTP GET/DELETE 调用 Api 时,一切正常。当客户端使用 HTTP POST/PUT 调用 Api 时(数据通过请求正文发送)。IIS 以 401 Unauthorized 响应。

这个问题消失了:

  • 在客户端工作站上运行 Fiddler 代理时。
  • IIS 身份验证配置为仅使用 NTLM

我浏览了许多博客文章和文章,但没有找到解决方案。

SignalR 表现出同样的奇怪行为。 客户端还使用 SignalR 与服务进行通信。客户端可以连接到 Hub 并接收消息。但是在尝试调用方法时得到 401(signalR 调用是使用 POST 完成的)。由于客户端在 Windows 7 上,它不支持 WebSockets。两种传输(服务器发送的事件、长轮询)上的行为相同。它与SignalR net45 的行为相似,在特定用户/机器组合上给出 401 Unauthorized。这篇文章中的修复(使用 Microsoft.AspNet.SignalR.Client.2.2.0\ lib\net40 \Microsoft.AspNet.SignalR.Client.dll)也适用于 SignalR。

编辑: SignalR net40 不使用 System.Net.Http 中的 HttpClient。所以报错一定是与System.Net.Http库有关。

非常感谢您的任何建议。

4

1 回答 1

0

可能的解决方法是:

  • System.Net.ServicePointManager.Expect100Continue = false;在创建任何 HttpClient 实例之前设置
  • 在 HttpClient 上禁用此 100Continue

    var c = new HttpClient();
    c.DefaultRequestHeaders.ExpectContinue = false;
    
于 2017-02-16T12:59:22.007 回答