为不同用户重用HttpClient

8
我一直在阅读关于使用HttpClient的最佳实践的文章。大多数人推荐在应用程序的生命周期内重复使用它,即使它是可释放的(IDisposable)。
我的Web应用程序正在与各种API通信,例如Facebook Graph API、Twitter API和Instagram API。
计划为与之通信的每个API创建一个独立的HttpClient,这是推荐的做法,因为这样我可以重用一些标头。
但现在问题来了,以Twitter API为例,使用我的Web应用程序的每个用户都有自己的授权标头(用户绑定访问令牌)。我认为这意味着我不能将授权标头设置为HttpClient对象的DefaultRequestHeaders。
当涉及到重复使用HttpClient用于具有不同授权标头的多个用户时,最佳实践是什么?
我可以为每个请求创建一个HttpRequestMessage对象,并将授权标头设置在httpRequestMessage对象上,而不是将其设置为默认标头httpClient.DefaultRequestHeaders.Authorization吗?
谢谢。
1个回答

16

由于创建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对象是否无害吗? - Jón Trausti Arason
@raRaRa - 不用谢。HttpRequestMessage实现IDisposable是因为Content属性的HttpContent类型是一个IDisposable。我没有看到任何理由说明dispose会造成任何伤害(特别是对于GET调用)。但我没有亲身体验过直接处理HttpRequestMessage实例的情况。 - Ralf Bönning

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接