如何在每个请求中使用不同的凭据重用 HttpClient 实例

Ste*_*e S 7 .net c# asp.net-mvc

我有一个 MVC 5 应用程序,其中包含一个发出 HTTP 请求的控制器操作。为此,我使用 HttpClient。

我已经学会从别人(比如这个博客帖子),并从我自己的经验,并能同时instantating众多HttpClients可以有不只是应用程序,但在服务器整体的性能产生负面影响。

到目前为止,我可以通过这样的代码解决重用 HttpClient 实例的要求

using (var handler = new HttpClientHandler() { Credentials = new NetworkCredential(getUsername(), getHashedPassword())})
using (var client = new HttpClient(handler))
{
   // Long running loop that makes a different HTTP request
   // on each iteration but using the same HttpClient instance
}
Run Code Online (Sandbox Code Playgroud)

需要在控制器操作中进行类似的重用,我选择在控制器类中使用 HttpClient 的静态实例。问题是传递给 HttpClientHandler 的凭据随着每个请求而变化,因为它们部分依赖于时间戳值(getHashedPassword()每次调用该方法时都会生成不同的密码)。

由于在远程服务器上执行身份验证的方式,我还必须在构成请求正文的 XML 内容中包含密码。

这就是我遇到问题的地方:

如何在对控制器操作的不同调用中重用相同的 HttpClient 实例,同时确保它使用具有最新凭据的处理程序?

甚至有可能做到这一点吗?

是否可以在将处理程序传递给 HttpInstance 后更新它?

或者我是否需要修改客户端对象的 DefaultRequestHeaders,如果不同线程同时使用该对象,根据某些来源可能会引入微妙的错误?

小智 1

HttpClientHandler 对象是处理 HttpClient 使用的请求的组件。您希望为每个需要新凭据的请求更新 HttpClientHandler。有多种方法可以执行此操作。\n您可以通过在每个请求之前创建新的 HttpClientHandler 实例来设置最新的凭据。

\n
using (var handler = new HttpClientHandler())\n    using (var client = new HttpClient(handler))\n    {\n       handler.Credentials = new NetworkCredential(getUsername(), getHashedPassword());\n       // HttpClient \xc3\xb6rne\xc4\x9fini kullanarak istekleri ger\xc3\xa7ekle\xc5\x9ftirin\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

通过更新 DefaultRequestHeaders,您可以在每个请求上传递新的凭据。

\n
using (var handler = new HttpClientHandler())\nusing (var client = new HttpClient(handler))\n{\n   client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes($"{getUsername()}:{getHashedPassword()}")));\n   // HttpClient \xc3\xb6rne\xc4\x9fini kullanarak istekleri ger\xc3\xa7ekle\xc5\x9ftirin\n}\n
Run Code Online (Sandbox Code Playgroud)\n