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 实例来设置最新的凭据。
\nusing (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 }\nRun Code Online (Sandbox Code Playgroud)\n通过更新 DefaultRequestHeaders,您可以在每个请求上传递新的凭据。
\nusing (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}\nRun Code Online (Sandbox Code Playgroud)\n