在NetworkCredentials中提供用户名和密码时,.net中的HttpClient会发出2个请求

Ian*_*kes 7 .net c#

当使用.net 4.5中的HttpClient进行基本身份验证时,我发现它发出了2个请求.

第一个失败,HTTP/1.1 401 Unauthorized,然后重新发送我们获得HTTP/1.1 200 OK的请求.

关于如何阻止它这样做的任何想法?

var credential = new NetworkCredential 
{ 
    UserName = username, 
    Password = password 
}
var httpClientHandler = new System.Net.Http.HttpClientHandler
{
    Credentials = credential
};
httpClient = new HttpClient(httpClientHandler, true)
{
    BaseAddress = address
};
Run Code Online (Sandbox Code Playgroud)

Tob*_*oth 5

尝试设置:

httpClientHandler.PreAuthenticate = true;
Run Code Online (Sandbox Code Playgroud)

我认为第一个请求仍然会得到初始的401,但是后续请求到相同的URI直到最后一个正斜杠应该总是发送没有401的认证头.

  • 我也这么认为,但是文档表明它不起作用 - 它仍然不会为第一个请求发送身份验证信息. (2认同)
  • 如果我放弃使用NetworkCredentials类并添加以下httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",Convert.ToBase64String(Encoding.UTF8.GetBytes(username +":"+ password))),我可以使用它; 但那真的很糟糕:) (2认同)

Jon*_*eet 1

您可以尝试按照 Tobberoth 的答案进行设置HttpClientHandler.PreAuthenticate,尽管该文档表明它仅在第一个请求后才有帮助:

除第一个请求外,PreAuthenticate 属性指示是否将身份验证信息与后续请求一起发送到与特定 Uri 匹配的 Uri(直到最后一个正斜杠),而无需等待服务器质询。

它对于第一个请求没有帮助,但可能有助于减少此后的往返次数。

另一件要尝试的事情是将“授权”包含在HttpClient.DefaultRequestHeaders. 如果这有效的话我会有点惊讶,但至少值得尝试。