使用 .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.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);
【讨论】:
如果我循环 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)