为不同的用户重用 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.GetAsyncPostAsync、. ..)。

类似这样的:

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的主要内容,如果未能解决你的问题,请参考以下文章

iOS iCarousel 重用不同专辑保留旧专辑信息问题

是否可以为不同的资源重用 Terraform 模板,为变量提供不同的值?

如何在android中为不同颜色的按钮重用选择器?

如何移除 UITableView (MonoTouch) 中可重用的单元格

为不同的表视图创建可重用的页脚视图(Swift 5)

JMeter - 如何创建可重用和模块化测试脚本