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

当使用.net 4.5中的HttpClient进行基本身份validation时,我发现它发出了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 }; 

尝试设置:

 httpClientHandler.PreAuthenticate = true; 

我认为第一个请求仍将获得最初的401,但是对于相同URI的后续请求直到最后一个正斜杠应始终发送没有401的认证头。

您可以尝试根据Tobberoth的答案设置HttpClientHandler.PreAuthenticate ,尽管该文档表明它只会在第一次请求后提供帮助:

除第一个请求外,PreAuthenticate属性指示是否将对后续请求的身份validation信息发送到与特定Uri匹配的Uri,直到最后一个正斜杠,而不等待服务器提出质询。

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

另一件要尝试的是在HttpClient.DefaultRequestHeaders包含“Authorization”。 如果可行,我会感到有些惊讶,但至少值得尝试。

在寻找我对NetworkCredentials的另一个问题的答案时,我偶然发现了两个问题,答案可能是您正在寻找的答案:

这里的答案是,至少WebRequest具有仅在获得401之后发送凭证的默认行为。 此处似乎解决方案可能正在使用CredentialCache。

我不确定CredentialCache是​​否与HttpClient一起工作,但如果不能,你可以切换到WebRequest或WebClient,或者这些信息只是让你走上另一个解决方案的路径。