我们目前正在使用HttpClient从MVC应用程序调用Web。
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的内容,并阅读了这个post,并将创建逻辑修改为
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;
}这会阻止即使多次调用也不能打开多个连接吗?
发布于 2019-04-01 12:40:00
IHttpClientFactory功能基于依赖注入,静态与依赖注入根本不兼容。正如文档清楚地表明的那样,正确的方法是:
public class ApiClient
{
private readonly HttpClient _client;
public ApiClient(HttpClient client)
{
_client = client;
}
...
}然后在ConfigureServices中注册此服务。
services.AddHttpClient<ApiClient>(c => { ... });客户端类不应该是静态的,也没有理由是静态的。
https://stackoverflow.com/questions/55454512
复制相似问题