我有一个MVC 5应用程序,其中包含一个控制器动作,该动作发出HTTP请求。 为此,我使用HttpClient。
我从其他人(例如这篇博客文章)和我的经验中学到, 同时使用大量的HttpClient实例可能会对整个应用程序以及服务器的性能产生负面影响。
到目前为止,我通过像这样的代码来解决重用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
}
在控制器操作中需要类似的重用,我选择在控制器类中使用HttpClient的静态实例。问题是由于凭据部分依赖于时间戳值(每次调用getHashedPassword()
方法会产生不同的密码),因此传递给HttpClientHandler的凭据随每个请求而变化。
由于远程服务器上进行身份验证的方式,我必须在构成请求正文的XML内容中包含密码。
这就是我的问题所在:
如何在调用控制器操作时跨不同调用重复使用相同的HttpClient实例,同时确保它正在使用具有最新凭据的处理程序?
这是否可能实现?
是否可以在将处理程序传递给HttpInstance后对其进行更新?
还是我需要修改客户端对象的DefaultRequestHeaders,根据某些来源的说法,如果该对象被不同线程并发使用,则可能引入微妙的错误?
httpClient.SendAsync(request)
并构造请求对象,添加任何所需的凭据到头属性。 - TheRock