【问题标题】:Using static HttpClient vs a different HTTPClient for each set of Endpoint为每组端点使用静态 HttpClient 与不同的 HTTPClient
【发布时间】:2018-05-21 14:03:49
【问题描述】:

所以我的应用程序涉及大量网络调用(可能连接到 10 个不同的服务器)和获取数据。从我读过的几篇文章中,建议重用 HTTPClient 实例,因为它可以防止资源(套接字等)的浪费。但是我发现围绕一个可扩展且健壮的静态 HTTPClient 设计一个模块有点困难。我所有的服务器连接都需要不同的标题集、查询参数等。 每个服务器/端点模型使用一个 HTTPClient 会更好吗?

【问题讨论】:

  • 这就是为什么您在HttpRequestMessageSendAsync() 上设置标题、内容和参数,而不是直接在客户端实例上设置这些内容。
  • 对于访问令牌之类的东西,您可以创建一个自定义 HttpMessageHandler
  • 缓存不同域的标头,并在发送时将其应用于请求消息。
  • @nkosi 你能解释一下缓存标头部分吗?你的意思是每个域都有一个单独的标题。
  • 您说您的所有服务器连接都需要不同的标头集等。如果该信息存储在委托中,可以在基于连接发送时应用于请求消息,那么您可以保留一个客户,只需应用必要的标头

标签: c# .net xamarin xamarin.android


【解决方案1】:

如果为每个服务器创建一个 HttpClient 实例会更容易。

您可以创建一个单例类,作为静态 httpClient 的包装器,并使用您的依赖注入机制传递它们:

public class ServerAClient {
  private HttpClient _client;
  private static object _locker = new object();

  public static HttpClient GetInstance() {
    if (_client == null) {
      lock (_locker) {
        // create your httpclient here
        _client = instance;
      }
    }

    return _client;
  }
}

public class MyController : Controller {
  private readonly ServerAClient _aclient;
  public MyController(ServerAClient Aclient) {
    _aclient = Aclient;
  }

  public IHttpAction Index() {
    ...
   _aclient.DoSomething();
  }
}

【讨论】:

    猜你喜欢
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多