Использовать HttpClientFactory из.NET 4.6.2

У меня есть консольное приложение .NET 4.6.2 (с использованием Simple Injector). Мне нужно позвонить в службу HTTP. Столкнувшись с проблемами с использованием HttpClient напрямую, я вместо этого пытаюсь использовать HttpClientFactory (https://github.com/aspnet/HttpClientFactory).

Проект/библиотека является .NET Standard 2.0, поэтому он должен?? работать в .NET 4.6.2, но он использует такие вещи, как IServiceCollection, который находится только в Core.

Поэтому мой вопрос заключается в том, могу ли я использовать HttpClientFactory в неосновном приложении.

Ответ 1

Все пакеты Microsoft.Extensions. * Предназначены для .NET Standard 2.0. Это означает, что вы можете использовать Dependency Injection, Configuration, Logging и HttpClientFactory, если добавите соответствующий пакет в ваше приложение.

Вам нужно добавить Microsoft.Extensions.Http, чтобы использовать HttpClientFactory и Microsoft.Extensions.Http.Polly, если вы хотите использовать его с Полли

Чтобы настроить HttpClientFactory, вам нужно добавить Microsoft.Extensions.DependencyInjection в ваш "основной" проект. Пакет Microsoft.Extensions.Http зависит только от Microsoft.Extensions.DependencyInjection.Abstractions, который содержит интерфейсы, а не от самого поставщика DI.

Ответ 2

Как сказал @Panagiotis Kanavos, вам нужно добавить Microsoft.Extensions.Http и Microsoft.Extensions.DependencyInjection. И это мой код ConsoleApp, вы можете сослаться на него.

class Program
{
     static void Main(string[] args)
     {
         Test();
         Console.Read();
     }

     static async void Test()
     {
        var serviceProvider = new ServiceCollection().AddHttpClient().BuildServiceProvider();
        var httpClientFactory = serviceProvider.GetService<IHttpClientFactory>();
        var client = httpClientFactory.CreateClient();
        var response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, "http://www.baidu.com"));
        var content = await response.Content.ReadAsStringAsync();
        Console.WriteLine(content);
     }
}