为不同的用户重用 HttpClient

Reusing HttpClient for different users

我阅读了很多有关使用 HttpClient 的最佳实践的资料。大多数人建议在应用程序的生命周期内重复使用它,即使它是 IDisposable.

我的 Web 应用程序正在与各种 API 进行通信,例如 Facebook Graph API、Twitter API 和 Instagram API。

计划是为每个与之通信的 API 创建一个单独的 HttpClient,建议这样做,因为这样我就可以重用一些 header。

但现在问题来了,让我们以 Twitter API 为例,每个使用我的网络应用程序的用户都有自己的授权 header(用户绑定访问令牌)。我相信这意味着我无法将授权 header 设置为 HttpClient object.

的 DefaultRequestHeaders

对于具有不同权限 header 的多个用户重复使用 HttpClient 时,最佳做法是什么?

我可以为每个请求创建一个 HttpRequestMessage object 并在 httpRequestMessage object 上设置授权 header,而不是将其设置为默认授权,httpClient.DefaultRequestHeaders.Authorization?

谢谢。

因为创建 HttpClient 会产生一些成本(尤其是套接字的数量),所以重用 HttpClient 实例会带来一些好处。它也是 thread-safe 。

为了在一个客户端实例的多个并发调用之间没有依赖关系,关键模式是使用 HttpRequestMessage class 并调用 HttpClient.SendAsync 方法(而不是使用 more方便 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 的请求 headers 将被使用(不再是 DefaultRequestHeaders)。