【问题标题】:Reusing HttpClient for different users为不同的用户重用 HttpClient
【发布时间】: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

谢谢。

【问题讨论】:

    标签: c# asp.net .net httpclient reusability


    【解决方案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 实例的任何第一手经验。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    相关资源
    最近更新 更多