如何在 .net 和 .net 核心中使用 HttpClient 调用多个客户端 API

Posted

技术标签:

【中文标题】如何在 .net 和 .net 核心中使用 HttpClient 调用多个客户端 API【英文标题】:How to call multiple client apis using HttpClient in .net and .net core 【发布时间】: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 谢谢。你给了很好的建议 【参考方案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)

【讨论】:

以上是关于如何在 .net 和 .net 核心中使用 HttpClient 调用多个客户端 API的主要内容,如果未能解决你的问题,请参考以下文章

如何在 .NET 核心中使用 .settings 文件?

如何使用asp.net核心在action方法中接收通过ajax请求发送的文件和整数

如何在 .net 核心应用程序中运行 PHP 应用程序

如何在使用 JWT 的 asp.net 核心 web 应用和 web api 中使用谷歌身份验证

如何使用html和jquery通过asp.net核心api调用获取数据?

如何使用带有 OpenId Connect 的刷新令牌在 asp.net 核心中处理过期的访问令牌