在我的.net核心项目中,我必须调用REST apis向客户端发送一些数据。总有超过9-10个客户端使用不同的api拥有自己的域和自定义标头。如果我每次创建HttpClient对象都会妨碍性能,因为每次创建和关闭新的TCP连接。如果我将使用单例设计模式创建单个HttpClient对象,则将为每个客户端使用相同的基本URL和默认标头。任何人都可以提出解决这个问题的方法。每次新的客户端api进行集成时,我都不想去创建新的HttpClient。
答案 0 :(得分:2)
如果您正在调用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)
。