【问题标题】:How to call multiple client apis using HttpClient in .net and .net core如何在 .net 和 .net 核心中使用 HttpClient 调用多个客户端 API
【发布时间】:2018-01-07 07:25:47
【问题描述】:

在我的一个 .net 核心项目中,我必须调用 REST api 来向客户端发送一些数据。总是有超过 9-10 个具有不同 api 的客户端具有自己的域和自定义标头。如果我每次都创建 HttpClient 对象,则会影响性能,因为每次都会创建和关闭新的 TCP 连接。如果我将使用单例设计模式创建单个 HttpClient 对象,那么每个客户端都将使用相同的基本 url 和默认标头。任何人都可以提出解决此问题的方法。每次新的客户端 api 来进行集成时,我都不想去创建新的 HttpClient。

【问题讨论】:

  • 如果您将代码粘贴在小提琴中,我们可以帮助您整理代码吗?
  • 我还没有写出实际的代码。但这是我打算使用的样本。这里 url 可以是任何客户端的 api public Output CallApi(string url) { var _httpClient = SingletonHttpClient.Instance; if(_httpClient != null) { using (var response = _httpClient.GetAsync(url).Result) { return response.Content.ConvertToObject().Result; } } 返回空值; }
  • @ToddMenier 谢谢。你给了很好的建议

标签: .net-core httpclient dotnet-httpclient rest-client


【解决方案1】:

如果您要调用 9-10 个不同的 API,其中客户端级别的东西(例如默认标头)可能会派上用场,那么 9-10 个静态 HttpClient 实例是最佳选择。如果编写 9-10 个实例感觉有点混乱/重复,您可以将它们包装在字典对象中,特别是 ConcurrentDictionary 将有助于保持实例化既惰性又线程安全。这样的事情应该可以工作:

public static class HttpClientManager
{
    private static ConcurrentDictionary<string, HttpClient> _clients = 
        new ConcurrentDictionary<string, HttpClient>();

    public static HttpClient Get(string baseUrl)
    {
        return _clients.GetOrAdd(baseUrl, _ =>
            new HttpClient { BaseAddress = new Uri(baseUrl) });
    }
}

那么,只要您需要使用一个,就只需HttpClientManager.Get(baseUrl)

【讨论】:

    猜你喜欢
    • 2018-02-28
    • 2019-10-23
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    相关资源
    最近更新 更多