详解如何在ASP.NETCore中使⽤IHttpClientFactory
利⽤IHttpClientFactory可以⽆缝创建HttpClient实例,避免⼿动管理它们的⽣命周期。
当使⽤ASP.Net Core开发应⽤程序时,可能经常需要通过HttpClient调⽤WebAPI的⽅法以检查终结点是否正常⼯作。要实现这⼀点,通常需要实例化HttpClient并使⽤该实例来调⽤你的⽅法。但是直接使⽤HttpClient也有⼀些缺点,主要与⼿动管理实例的⽣命周期有关。
你可以使⽤IHttpClientFactory创建HttpClient来避免这些问题。IHttpClientFactory是在.Net Core 2.1引⼊的,它提供了⼀个命名,配置和创建HttpClient实例的核⼼功能,并能⾃动管理实例的池化和⽣命周期。
下⾯我们通过代码进⼀步讨论HttpClient和IHttpClientFactory,以及所设计的概念。要使⽤提供的代码,你需要安装Visual Studio 2019。
在Visual Studio 2019中创建⼀个ASP.NET Core MVC项⽬
假设你的系统中安装了Visual Studio 2019,请按照下⾯列出来的步骤创建⼀个新的ASP.NET Core项⽬。
1. 启动Visual Studio IDE。
2. 点击“创建新项⽬”。
3. 在“创建新项⽬”窗⼝中,从模板列表中选择ASP.NET Core Web应⽤程序。
4. 单击Next。
5. 在“配置新项⽬”窗⼝中,指定新项⽬的名称和位置。
6. 可以选择“将解决⽅案和项⽬放在同⼀个⽬录中”复选框。
7. 点击Create。
8. 在“创建⼀个新的ASP.NET Core Web应⽤程序“窗⼝中,选择。NET Core作为运⾏时,然后选择asp Core作为运⾏时。NET Core 3.1(或更⾼版本)。
9. 选择“Web Application (Model-View-Controller)”作为项⽬模板来创建⼀个新的ASP.NET Core MVC应⽤程序。
10. 确保复选框“启⽤Docker⽀持”和“配置HTTPS”没有选中,因为我们不会在这⾥使⽤这些特性。
11. 确保⾝份验证设置为“⽆⾝份验证”,因为我们也不会使⽤⾝份验证。
12. 单击Create。
按照这些步骤将创建⼀个新的ASP.NET Core MVC应⽤程序。在新项⽬中,创建⼀个新的API Controller,并使⽤默认名称保存它,即ValuesController。我们将在接下来的部分中使⽤这个项⽬。
挑战HttpClient
尽管HttpClient没有直接实现IDisposable接⼝,但它扩展了System.Net.Http。HttpMessageInvoker,这个类实现了IDisposable。然⽽,当使⽤HttpClient实例时,你不应该⼿动操作释放它们。尽管可以在HttpClient实例上调⽤Dispose⽅法,但不推荐这样做。
应该怎么做呢?⼀种选择是使HttpClient静态化,或者将HttpClient的⾮静态实例包装在⾃定义类中,并使其成为单例类。但是更好的替代⽅法是使⽤IHttpClientFactory来⽣成HttpClient的实例,然后使⽤该实例来调⽤操作⽅法。
IHttpClientFactory 和HttpClientFactory
IHttpClientFactory是⼀个由DefaultHttpClientFactory类实现的接⼝,这是⼀个⼯⼚模式。DefaultHttpClientFactory实现了IHttpClientFactory和IHttpMessageHandlerFactory接⼝。IHttpClientFactory提供了ASP.NET Core对创建、缓存和处理HttpClient实例提供了出⾊的内置⽀持。
请注意,HttpClientFactory只是⼀个帮助类,⽤于创建使⽤提供的处理程序配置的HttpClient实例。这个
类有以下⽅法:
Create(DelegatingHandler[])
Create(HttpMessageHandler,DelegatingHandler[])
CreatePipeline(HttpMessageHandler,IEnumerable<DelegatingHandler>)
重载的HttpClientFactory类的Create⽅法看起来像这样:
public static HttpClient Create(params DelegatingHandler[] handlers)
{
mvc实例return Create(new HttpClientHandler(), handlers);
}
public static HttpClient Create(HttpMessageHandler innerHandler, params DelegatingHandler[] handlers)
{
HttpMessageHandler pipeline = CreatePipeline(innerHandler, handlers);
return new HttpClient(pipeline);
}
引⼊HttpClientFactory和IHttpClientFactory是为了更好地管理HttpMessageHandler实例的⽣命周期。
为什么使⽤IHttpClientFactory?
当你释放HttpClient实例时,连接将保持打开状态长达4分钟。此外,可以在任何时间点打开socket的数量是有限制的——不能同时打开太多socket。因此,当使⽤太多HttpClient实例时,可能会耗尽socket。
这就是IHttpClientFactory的意义所在。你可以通过利⽤IHttpClientFactory来创建⽤于调⽤HTTP API⽅法的HttpClient实例,以避免HttpClient所⾯临的问题。在ASP.NET Core中实现IHttpClientFactory的主要⽬标是为了确保使⽤⼯⼚模式创建HttpClient 实例的同时避免socket耗尽。
在ASP.NET Core中注册IHttpClientFactory实例
你可以在Startup类的ConfigureServices⽅法中,通过调⽤IServiceCollection实例上的AddHttpClient扩展⽅法注册⼀个IHttpClientFactory类型的实例,如下:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddHttpClient();
}
将IHttpClientFactory实例注⼊到控制器
可以通过如下代码将将IHttpClientFactory实例注⼊到控制器:
public class HomeController : Controller
{
private IHttpClientFactory _httpClientFactory;
private readonly ILogger<HomeController> _logger;
public HomeController(ILogger<HomeController> logger,
IHttpClientFactory httpClientFactory)
{
_logger = logger;
_httpClientFactory = httpClientFactory;
}
}
在Action中调⽤HttpClient
要通过使⽤IHttpClientFactory创建HttpClient,应该调⽤CreateClient⽅法。⼀旦HttpClient实例可⽤,就可以在HomeController类的index⽅法中使⽤以下代码来调⽤ValuesController类的Get⽅法。
public async Task<IActionResult> Index()
{
HttpClient httpClient = _httpClientFactory.CreateClient();
httpClient.BaseAddress = new Uri("localhost:1810/");
var response = await httpClient.GetAsync("/api/values");
string str = await response.Content.ReadAsStringAsync();
List<string> data = JsonSerializer.Deserialize<List<string>>(str);
return View(data);
}
使⽤IHttpClientFactory在ASP.NET Core中创建和管理HttpClient实例
有⼏种⽅法可以在应⽤程序中使⽤IHttpClientFactory。这包括直接使⽤IHttpClientFactory、使⽤命名client和类型client。
基本的或⼀般的使⽤模式,即直接使⽤IHttpClientFactory—在前⾯的⼩节中已经讨论过了。请参考“注册⼀个IHttpClientFactory实例”⼀节,该节讨论了如何注册HttpClient实例。
如果你想使⽤不同配置的HttpClient实例,以下是⼀个不错的选择。下⾯的代码⽚段说明了如何创建。
services.AddHttpClient("github", c =>
{
c.BaseAddress = new Uri("api.github/");
c.DefaultRequestHeaders.Add("Accept",
"application/vnd.github.v3+json");
c.DefaultRequestHeaders.Add("User-Agent", "This is a test user agent");
});
第⼆种⽅法是使⽤包装了HttpClient实例的⾃定义类,该⾃定义类封装了通过HTTP协议调⽤所有终结点的逻辑。下⾯的代码⽚段说明了如何定义⾃定义HttpClient类。
public class ProductService : IProductService
{
private IHttpClientFactory _httpClientFactory;
private readonly HttpClient _httpClient;
private readonly string _baseUrl = "localhost:1810/";
public ProductService(HttpClient httpClient)
{
_httpClient = httpClient;
}
public async Task<Catalog> GetAllProducts()
{
_httpClient = _httpClientFactory.CreateClient();
_httpClient.BaseAddress = new Uri(_baseUrl);
var uri = "/api/products";
var result = await _httpClient.GetStringAsync(uri);
return JsonConvert.DeserializeObject<Product>(result);
}
}
通过以下代码注册⾃定义的client:
services.AddHttpClient<IProductService, ProductService>();
将MessageHandler添加到命名管道中
MessageHandler是扩展⾃HttpMessageHandler类,它可以接受HTTP请求并返回HTTP响应。如果你想构建⾃⼰的MessageHandler,你应该创建⼀个继承DelegatingHandler的类。
你可以将HttpMessageHandler添加到请求处理管道中。可以在Startup类的ConfigureServices⽅法中使⽤以下代码将HttpMessageHandler添加到管道中。
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpClient("github", c =>
{
c.BaseAddress = new Uri("api.github/");
})
.AddHttpMessageHandler<DemoHandler>();
services.AddTransient<DemoHandler>();
}
IHttpClientFactory是⼀个⾃ Core 2.1以来就可⽤的⼯⼚类。如果你使⽤IHttpClientFactory来创建HttpClient实例,那么底层HttpClientMessagehandler实例的池化和⽣命周期将⾃动管理。IHttpClientFactory还负责处理⼀些常见问题,⽐如⽇志记录。
到此这篇关于详解如何在ASP.NET Core中使⽤IHttpClientFactory的⽂章就介绍到这了,更多相关ASP.NET Core使⽤IHttpClientFactory内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论