如何在 .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 @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的主要内容,如果未能解决你的问题,请参考以下文章
如何使用asp.net核心在action方法中接收通过ajax请求发送的文件和整数
如何在使用 JWT 的 asp.net 核心 web 应用和 web api 中使用谷歌身份验证