某些时候我们需要为HttpClient动态配置一些东西, 例如证书等, 参考博问 如何使用IHttpClientFactory动态添加cer证书. 针对如何为HttpClient对象添加证书, 官方文档的实现是:使用证书和来自 IHttpClientFactory 的命名 HttpClient 实现 HttpClient 和 使用证书和 HttpClientHandler IHttpClientFactory.CreateClient是如何将HttpClient创建出来的? 使用 至于用它就简单了 var factory = ServiceProvider.GetService<IHttpClientFactory>(); var httpClientForBaidu = 另外,有关IHttpClientFactory背后的故事可以查看文章Exploring the code behind IHttpClientFactory in depth, 很完整的流程图在配上代码
不过它因为出现的比较早,并没有使用asp.net core中的IHttpClientFactory 管理HttpClient实例,而是自己管理。 一般是根据host来缓存一个HttpClient实例,比如你请求所有的https://www.baidu.com/ 都用一个缓存的实例,这样可能会有些问题,比如Dns更新等; 对于我们有着用IHttpClientFactory services.AddHttpClient(); //... } 使用 private readonly IFlurlClient _flurlClient; public CommonController(IHttpClientFactory
在一个采用依赖注入框架的应用中,我们一般不太推荐利用手工创建的HttpClient对象来进行HTTP调用,使用的HttpClient对象最好利用注入的IHttpClientFactory工厂来创建。 IHttpClientFactory类型由“Microsoft.Extensions.Http”这个NuGet包提供,“Microsoft.NET.Sdk.Web”SDK具有该包的默认引用。 工厂创建HttpClient对象 引入IHttpClientFactory工厂将会使一切变得简单,我们只需要在需要进行HTTP调用的时候利用这个工厂创建出对应的HttpClient对象就可以了。 在下面的演示程序中,我们调用ServiceCollection对象的AddHttpClient扩展方法对IHttpClientFactory工厂进行了注册,并利用构建出来的IServiceProvider 在每次进行HTTP调用的时候,我们利用这个IHttpClientFactory工厂实时地将HttpClient对象创建出来。
在《利用IHttpClientFactory工厂来创建HttpClient》之后,我们将关注点放到HttpClient对象上。 = new ServiceCollection() .AddHttpClient() .BuildServiceProvider() .GetRequiredService<IHttpClientFactory [S1209]定制HttpClient管道 对于任何一个由IHttpClientFactory工厂创建的HttpClient对象来说,除了位于管道末端作为主处理器的HttpClientHandler可以替换之外 图2 定制处理器管道 [S1210]针对HTTP调用的日志输出(>=Information) 对于由IHttpClientFactory工厂创建的HttpClient来说,它的处理器管道总是包含两个与日志相关的处理器 在利用IHttpClientFactory工厂将HttpClient对象创建出来后,我们用它向地址“http://www.baidu.com”发送了一个GET请求。
一、前言
在我们开发当中经常需要向特定URL地址发送Http请求操作,在.net core 中对httpClient使用不当会造成灾难性的问题,这篇文章主要来分享.net core中通过IHttpClientFactory .net core 2.1 开始引入了IHttpClientFactory 工厂类来自动管理IHttpClientFactory 类的创建和资源释放,可以通过Ioc 注入方式进行使用,代码如下:
services.AddControllers ();
services.AddHttpClient();
调用代码如下:
private readonly IHttpClientFactory _clientFactory;
public FirstController (IHttpClientFactory clientFactory)
{
_clientFactory = clientFactory;
}
///
注入 HttpClientFactory 并调用 API 在服务或控制器中注入 IHttpClientFactory 实例,并使用它发送请求: public class MyService { private readonly IHttpClientFactory _clientFactory; public MyService(IHttpClientFactory
每次调用 IHttpClientFactory.CreateClient() 时,会返回一个新的 HttpClient 实例,但这些实例共享底层的 HttpMessageHandler 池。 IHttpClientFactory 的默认实现是 DefaultHttpClientFactory,它被注册为单例服务。 () 创建 HttpClient 实例,适用于简单的场景: public classMyService { privatereadonly IHttpClientFactory _clientFactory ; public MyService(IHttpClientFactory clientFactory) { _clientFactory = clientFactory _clientFactory; public MyService(IHttpClientFactory clientFactory) { _clientFactory
} public class ElectricMeterService : IElectricMeterService { private readonly IHttpClientFactory ; public ElectricMeterService( IHttpClientFactory httpClientFactory, ILogger 还需要调用 AddHttpClient 方法注册 IHttpClientFactory。
ASP.NETCore IHttpClientFactory缓存工厂 曲线救国 IHttpClientFactory 充分体现了“计算机领域的任何问题都可以通过增加一个间接的中间层来解决” 这一方法论。 为解决重用HttpClient引起的DNS解析副作用,IHttpClientFactory对实际使用的核心HttpClienthandler开启了缓存工厂模式,在外侧尝试跟踪并控制Handler的存活周期 在使用层面, IHttpClientFactory并非直接管控连接池连接,而是在外层对Handler做存活缓存,故工厂对外只提供了SetHandlerLifetime(TimeSpan.FromMinutes IHttpCLientFactory 工厂除了具备 “通过管理HttpClientHandler实例的缓存生存期,避免手动管理 HttpClient 生存期时出现的DNS问题”, 还具有 HttpClient .NET Core 2.1的思路是增强HttpClient库底层的连接池能力,提供了SocketsHttpHandler来控制连接的生命周期, IHttpClientFactory的思路是绕过HttpClient
builder.Services.AddTransient<IKernel>((services) => { var httpClientFactory = services.GetRequiredService<IHttpClientFactory AddSingleton<OpenAIChatCompletion>((services) => { var httpClientFactory = services.GetRequiredService<IHttpClientFactory skprompt.txt则是当前插件使用的prompt 加载插件 在这里我们注入了IKernel private readonly IKernel _kernel; private readonly IHttpClientFactory = new List<AdCode>(); } private readonly IHttpClientFactory _httpClientFactory; public WeatherPlugin(IHttpClientFactory httpClientFactory) { _httpClientFactory = httpClientFactory
app.MapControllers(); app.Run(); private readonly ILogger<WeatherForecastController> _logger; private readonly IHttpClientFactory _httpClientFactory; public WeatherForecastController(ILogger<WeatherForecastController> logger, IHttpClientFactory response.Content.ReadAsStringAsync(); Console.WriteLine(responseBody); } 这里也可以选择直接注入HttpClient实例而不是IHttpClientFactory 需要注意的是,我们不再使用using语句来包裹HttpClient,而是通过依赖注入的方式获取HttpClient实例或IHttpClientFactory。 在控制器中注入IExampleService: private readonly ILogger<WeatherForecastController> _logger; private readonly IHttpClientFactory
针对HttpClientFactory的处理涉及到IHttpClientBuilder、IHttpClientFactory、IHttpMessageHandlerFactory、ITypedHttpClientFactory services.AddHttpClient() 我们在创建或者配置HttpClient对象的时候,会在ConfigureServices方法中增加services.AddHttpClient(),即可注册IHttpClientFactory DefaultHttpMessageHandlerBuilder>(); 12: services.AddSingleton<DefaultHttpClientFactory>(); 13: services.TryAddSingleton<IHttpClientFactory 它继承了IHttpClientFactory、IHttpMessageHandlerFactory这两个接口。由此可见,DefaultHttpClientFactory实例的创建被拆成了两种行为。 IHttpClientFactory的定位是一个抽象工厂,可以为指定名称的HttpClient实例创建自定义配置,它只有一个方法,HttpClient CreateClient(string name)
HttpClientFactory简单使用 Startup添加 services.AddHttpClient(); 通过IHttpClientFactory创建一个HttpClient对象,后面操作如旧 [ApiController] public class ValuesController : ControllerBase { private readonly IHttpClientFactory _httpClientFactory; public ValuesController(IHttpClientFactory httpClientFactory) {
HttpClientFactory简单使用 Startup添加 Copy services.AddHttpClient(); 通过IHttpClientFactory创建一个HttpClient对象,后面操作如旧 [ApiController] public class ValuesController : ControllerBase { private readonly IHttpClientFactory _httpClientFactory; public ValuesController(IHttpClientFactory httpClientFactory) {
httpClient.DefaultRequestHeaders.Add("x-www-baz", "789"); } } 第二种方式 对于.NET Core应用来说,我们更推荐的做法是采用依赖注入的方式,利用IHttpClientFactory var httpClient = services .BuildServiceProvider() .GetRequiredService<IHttpClientFactory
Route("api/[controller]")] [ApiController] public class HttpClientController : ControllerBase { IHttpClientFactory _httpClientFactory; public HttpClientController(IHttpClientFactory httpClientFactory) {
public class ApiHealthCheck : IHealthCheck { private readonly IHttpClientFactory _httpClientFactory ; public ApiHealthCheck(IHttpClientFactory httpClientFactory) { _httpClientFactory =
然后在 RequestController 中使用 ClientPolicy: private readonly ClientPolicy _clientPolicy; private readonly IHttpClientFactory _clientFactory; public RequestController(ClientPolicy clientPolicy, IHttpClientFactory clientFactory StatusCode(StatusCodes.Status500InternalServerError); } 由于我们在 Program.cs 中为命名的 Http 客户端配置了策略,因此可以直接使用 IHttpClientFactory
HttpClientFactoryOptions对象源代码,如下:
///
services.AddHttpClient(); services.AddScoped(typeof(ClassInService));//此处无关HttpClient,请暂时忽视他 在幕后,这将注册一些必需的服务,其中一个是IHttpClientFactory /// /// <param name="clientFactory"></param> public ClassInService(IHttpClientFactory x-www-form-urlencoded"); var response = client.PostAsync("MyBlogUrl", content); } 这里我们首先添加对IHttpClientFactory IHttpClientFactory允许我们请求和接收HttpClient实例。 我们使用HttpClientFactory创建客户端。