HttpClientFactory - .NET Standard - вызывать веб-API - PullRequest
0 голосов
/ 01 апреля 2019

В настоящее время мы используем HttpClient для вызова веб-API из приложения MVC.

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;
}

Будет ли это препятствовать открытию нескольких соединений, даже если они были вызваны несколько раз?

1 Ответ

3 голосов
/ 01 апреля 2019

Функциональность IHttpClientFactory основана на внедрении зависимостей, а статика в принципе несовместима с внедрением зависимостей.Как ясно показывают документы , правильный способ сделать это:

public class ApiClient
{
    private readonly HttpClient _client;

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

    ...
}

И затем вы регистрируете этот сервис в ConfigureServices:

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

.клиентский класс не должен быть статическим, и нет никаких причин для того, чтобы он был статическим.

...