在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
利用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项目。 按照这些步骤将创建一个新的ASP.NET Core MVC应用程序。在新项目中,创建一个新的API Controller,并使用默认名称保存它,即ValuesController。我们将在接下来的部分中使用这个项目。 挑战HttpClient尽管HttpClient没有直接实现IDisposable接口,但它扩展了System.Net.Http。HttpMessageInvoker,这个类实现了IDisposable。然而,当使用HttpClient实例时,你不应该手动操作释放它们。尽管可以在HttpClient实例上调用Dispose方法,但不推荐这样做。 IHttpClientFactory 和HttpClientFactoryIHttpClientFactory是一个由DefaultHttpClientFactory类实现的接口,这是一个工厂模式。DefaultHttpClientFactory实现了IHttpClientFactory和IHttpMessageHandlerFactory接口。IHttpClientFactory提供了ASP.NET Core对创建、缓存和处理HttpClient实例提供了出色的内置支持。 Create(DelegatingHandler[]) Create(HttpMessageHandler,DelegatingHandler[]) CreatePipeline(HttpMessageHandler,IEnumerable<DelegatingHandler>) 重载的HttpClientFactory类的Create方法看起来像这样: public static HttpClient Create(params DelegatingHandler[] handlers) { 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。 在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("http://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。 如果你想使用不同配置的HttpClient实例,以下是一个不错的选择。下面的代码片段说明了如何创建。 services.AddHttpClient("github", c => { c.BaseAddress = new Uri("https://api.github.com/"); 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 = "http://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("https://api.github.com/"); }) .AddHttpMessageHandler<DemoHandler>(); services.AddTransient<DemoHandler>(); } IHttpClientFactory是一个自.net Core 2.1以来就可用的工厂类。如果你使用IHttpClientFactory来创建HttpClient实例,那么底层HttpClientMessagehandler实例的池化和生命周期将自动管理。IHttpClientFactory还负责处理一些常见问题,比如日志记录。 到此这篇关于详解如何在ASP.NET Core中使用IHttpClientFactory的文章就介绍到这了,更多相关ASP.NET Core使用IHttpClientFactory内容请搜索极客世界以前的文章或继续浏览下面的相关文章希望大家以后多多支持极客世界! |
请发表评论