Я планирую использовать пакет Microsoft.Extensions.Http в моем проекте ASP.NET Framework 4.7.2 Webforms. Поскольку в .NET Framework нет встроенного контейнера внедрения зависимостей, я не использую пакеты внедрения зависимостей. Основываясь на этом ответе, я не уверен в последней строке -
Microsoft.Extensions.Http предоставляет только HttpClientFactory, а не новый оптимизированный HttpClient. Это доступно только в .NET Core 2.1.
Могу ли я реализовать IHttpClientFactory без DI и с использованием одноэлементного метода в моем проекте Framework и избавиться от двух проблем прямого использования HttpClient — исчерпания сокетов и разрешения DNS? Есть ли что-то еще, что нужно сделать на основе приведенного выше комментария?
К сожалению, использование HttpClientFactory
тесно интегрировано с инфраструктурой DI. К счастью, создать новый IHttpClientFactory
без использования полной инфраструктуры DI можно в несколько строк:
IHttpClientFactory factory = new ServiceCollection()
.AddHttpClient()
.BuildServiceProvider()
.GetRequiredService<IHttpClientFactory>();
С помощью приведенного выше кода вы создаете нового нового поставщика услуг (который является контейнером MS.DI), который просто содержит регистрации для клиентского пакета HTTP, который включает регистрацию для IHttpClientFactory
, а IHttpClientFactory
извлекается непосредственно из контейнера. Фабрика хранится в переменной, а сам контейнер больше не используется.
Полноценное рабочее консольное приложение должно выглядеть так:
// This requires the 'Microsoft.Extensions.Http` package to be installed
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Net.Http;
using System.Threading.Tasks;
internal class Program
{
static async Task Main(string[] args)
{
IHttpClientFactory factory = new ServiceCollection()
.AddHttpClient()
.BuildServiceProvider()
.GetRequiredService<IHttpClientFactory>();
HttpClient client = factory.CreateClient();
string html = await client.GetStringAsync("https://blogs.cuttingedge.it/steven/");
Console.WriteLine(html);
Console.ReadLine();
}
}
Лучше всего кешировать IHttpClientFactory
на время жизни вашего приложения, а не воссоздавать его на лету.
Привет @Steven, разве нам не нужно избавляться от IServiceProvider? Или создать прицел на нем? И можно ли использовать тот же подход для создания ILogger в приложении WebForms 4.7?
Я бы сказал, что для этого конкретного варианта использования нет необходимости создавать область действия (поскольку IHttpClientFactory
регистрируется как синглтон) и нет необходимости удалять IServiceProvider
при закрытии приложения (поскольку единственное, чем оно управляет, — это IHttpClientyFactory
) . Попытка избавиться от поставщика услуг или управлять областью действия только усложняет решение, но не дает дополнительных преимуществ.
Еще 2 вопроса: 1) Если мы хотим использовать ILogger в веб-приложении .NET Framework, можем ли мы сделать то, что я написал здесь, то есть вопрос, который я задал здесь. Кстати, если бы вы могли помочь мне с этим вопросом, было бы очень полезно :) 2) Мы также хотим зарегистрировать несколько пользовательских классов. Как в таком случае передать IServiceProvider (для создания областей) различным классам потребителей с помощью MS DI в Framework? Нам нужна только инъекция конструктора. @Стивен
Привет @Steven, я реализовал IHttpClientFactory, очень похожий на то, что вы написали, на самом деле вдохновленный этим Я просто хотел убедиться, что эта реализация полностью проверена и не вызовет проблем. Потому что этот комментарий, который Панайотис дал здесь, меня смутил. «Microsoft.Extensions.Http предоставляет только HttpClientFactory, а не новый оптимизированный HttpClient. Он доступен только в .NET Core 2.1». Итак, мы должны хорошо использовать предложенный вами подход, верно?