0

我们目前正在使用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;
}

即使多次调用,这是否会阻止打开多个连接?

4

1 回答 1

4

IHttpClientFactory功能基于依赖注入,静态与依赖注入根本不兼容。正如文档清楚地表明的那样,正确的方法是:

public class ApiClient
{
    private readonly HttpClient _client;

    public ApiClient(HttpClient client)
    {
        _client = client;
    }

    ...
}

然后您在以下位置注册此服务ConfigureServices

services.AddHttpClient<ApiClient>(c => { ... });

客户端类不应该是静态的,也没有理由让它是静态的。

于 2019-04-01T12:40:00.357 回答