我计划在我的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
,而不是在运行中重新创建它。