使用 .NET 4.6.2 中的 HttpClientFactory

Posted

技术标签:

【中文标题】使用 .NET 4.6.2 中的 HttpClientFactory【英文标题】:Use HttpClientFactory from .NET 4.6.2 【发布时间】:2018-07-24 12:41:13 【问题描述】:

我有一个 .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。

【问题讨论】:

IServiceCollection 也不仅仅是核心。 docs.microsoft.com/en-us/dotnet/api/… 表示 ASP.NET Core 2.1、2.0、1.1、1.0 查看Nuget包你会看到nuget.org/packages/Microsoft.Extensions.DependencyInjection/… 【参考方案1】:

所有 Microsoft.Extensions.* 包都面向 .NET Standard 2.0。这意味着如果您将适当的包添加到您的应用程序,您可以使用依赖注入、配置、日志记录 HttpClientFactory。

如果你想和Polly一起使用,你需要添加Microsoft.Extensions.Http来使用HttpClientFactory和Microsoft.Extensions.Http.Polly

要配置 HttpClientFactory,您必须将 Microsoft.Extensions.DependencyInjection 添加到您的“主”项目中。 Microsoft.Extensions.Http 包仅依赖于包含接口的Microsoft.Extensions.DependencyInjection.Abstractions,而不依赖于 DI 提供程序本身。

【讨论】:

我的一些 Web 服务项目已经在使用 Ninject 作为 DI 提供程序。在这种情况下也可以使用 HttpClientFactory 吗?是否有任何其他机制可以将 HttpClientFactory 与 Ninject 一起使用? PS:我的 Web 服务不在 .NET 核心中,而是使用 .NET 4.7。* 配置方面有示例代码吗? @Vinod 我们做同样的事情,我们使用new ServiceCollection 并使用其上的所有扩展方法来绑定所有的东西,然后有一个使用IServiceCollection 服务提供者的INinjectHttpClientFactory实际构建东西。 是否可以在 Ninject 模块中实现?【参考方案2】:

正如@Panagiotis Kanavos 所说,您需要添加 Microsoft.Extensions.HttpMicrosoft.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);
     

【讨论】:

如果我循环 Test(),它会创建多个客户端实例吗? @Gopi 是的,但是如果您在此方法之外注册 serviceProvider,那么每个 var client = httpClientFactory.CreateClient(); 都会返回相同的客户端 HttpClient 可以创建多次也没关系。 HttpMessageHandler 会被复用,只要你使用同一个工厂实例,这是这里的重要部分。

以上是关于使用 .NET 4.6.2 中的 HttpClientFactory的主要内容,如果未能解决你的问题,请参考以下文章

.NET 框架版本 4.6.1 到 4.7 使用当前的 binary/web.config

在旧的 .net 4.6.2 项目中使用 IdentityServer4.AccessTokenValidation

.net framework(4.6.2) 迁移 .net core(2.2) 总结

详解 UWP (通用 Windows 平台) 中的两种 HttpClient API

.Net Framework 4.6.1 不默认为 TLS 1.2

在 4.6.2 Framework 中部署 .NET Standard 程序集 (Microsoft.AspNetCore.SignalR.Client)