为不同的用户重用 HttpClient
Posted
技术标签:
【中文标题】为不同的用户重用 HttpClient【英文标题】:Reusing HttpClient for different users 【发布时间】:2016-11-19 18:39:29 【问题描述】:我已经阅读了很多关于使用 HttpClient
时的最佳实践的信息。大多数人建议在应用程序的整个生命周期内重复使用它,即使它是 IDisposable
。
我的网络应用程序正在与各种 API 通信,例如 Facebook Graph API、Twitter API 和 Instagram API。
计划是为与其通信的每个 API 创建一个单独的 HttpClient,这是推荐的,因为这样我可以重用一些标头。
但是现在问题来了,让我们以 Twitter API 为例,每个使用我的 Web 应用程序的用户都有自己的授权标头(用户绑定访问令牌)。我相信这意味着我无法将授权标头设置为 HttpClient
对象的 DefaultRequestHeaders。
在为具有不同授权标头的多个用户重用 HttpClient
时,最佳做法是什么?
我能否为每个请求创建一个HttpRequestMessage
对象并在httpRequestMessage 对象上设置授权标头,而不是将其设置为默认值httpClient.DefaultRequestHeaders.Authorization
?
谢谢。
【问题讨论】:
【参考方案1】:因为创建HttpClient
涉及一些成本(尤其是套接字数量),所以重用HttpClient
实例有一些好处。它也是线程安全的。
为了使多个并发调用与一个客户端实例之间没有依赖关系,关键模式是使用HttpRequestMessage
类并调用HttpClient.SendAsync
方法(而不是使用更方便的HttpClient.GetAsync
、PostAsync
、. ..)。
类似这样的:
var request = new HttpRequestMessage()
RequestUri = new Uri("http://api.twitter.com/someapiendpoint"),
Method = HttpMethod.Get
// set the authorization header values for this call
request.Headers.Accept.Add(...);
var response = await client.SendAsync(request);
现在将使用HttpRequestMessage
的请求标头(不再使用DefaultRequestHeaders
)。
【讨论】:
谢谢,这正是我打算做的。你知道在 SendAsync 完成后释放 HttpRequestMessage 对象是否无害吗? @raRaRa - 欢迎您。 HttpRequestMessage 实现 IDisposable,因为 Content 属性的 HttpContent 类型是 IDisposable。我看不出为什么 dispose 会造成任何伤害(尤其是对于 GET 调用)。但是我还没有直接处理 HttpRequestMessage 实例的任何第一手经验。以上是关于为不同的用户重用 HttpClient的主要内容,如果未能解决你的问题,请参考以下文章
是否可以为不同的资源重用 Terraform 模板,为变量提供不同的值?