我们目前正在使用该HttpClient
从MVC应用程序调用Web API。
HttpClient
是静态帮助程序类的一部分,如下所示
public static class ApiClient
{
private static HttpClient MyHttpClient()
{
HttpClient client = new HttpClient();
...
return client;
}
public static T HttpGet<T>(string requestUri)
{
using (var client = MyHttpClient())
{
...
}
}
}
它从 MVC 控制器调用,如下所示
ApiClient.HttpGet<MyModel>("<<API URL>>");
因此,每当调用 ApiClient 时,都会打开一个新的基础连接,这不是正确的方式。
我阅读了有关HttpClientFactory
并阅读了这篇文章,我导致将创建逻辑修改为
private static HttpClient MyHttpClient()
{
var serviceProvider = new ServiceCollection().AddHttpClient().BuildServiceProvider();
var httpClientFactory = serviceProvider.GetService<IHttpClientFactory>();
var client = httpClientFactory.CreateClient();
//HttpClient client = new HttpClient();
...
return client;
}
即使多次调用,这会阻止打开多个连接吗?
IHttpClientFactory
功能基于依赖注入,静态与依赖注入从根本上不兼容。正如文档清楚地表明的那样,执行此操作的正确方法是:
public class ApiClient
{
private readonly HttpClient _client;
public ApiClient(HttpClient client)
{
_client = client;
}
...
}
然后您在ConfigureServices
中注册此服务:
services.AddHttpClient<ApiClient>(c => { ... });
客户端类不应是静态的,也没有理由将其静态。