HttpClientFactory - .NET Standard - Invoke Web API



我们目前正在使用该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 => { ... });

客户端类不应是静态的,也没有理由将其静态。

最新更新