IHttpClientFactory在.net Framework 4.7.2中没有依赖注入



我计划在我的ASP中使用Microsoft.Extensions.Http包。. NET Framework 4.7.2 Webforms项目。因为在。net框架中没有内置的DI容器,所以我没有使用DI包。根据这个答案,我不确定最后一行

Microsoft.Extensions。Http只提供HttpClientFactory,而不提供新的优化HttpClient。这只适用于。net Core 2.1

我可以实现IHttpClientFactory没有DI和使用单例方法在我的框架项目,摆脱直接使用HttpClient的2个问题-套接字耗尽和DNS解析?根据上面的注释

,还有什么需要做的吗?

不幸的是,HttpClientFactory的使用与DI框架紧密集成在一起。幸运的是,在不使用完整DI基础设施的情况下创建一个新的IHttpClientFactory可以在几行代码中完成:

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/p/commands");
Console.WriteLine(html);
Console.ReadLine();
}
}

最好是在应用程序的生命周期内缓存IHttpClientFactory,而不是在运行中重新创建它。

最新更新