操作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.net 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是一个由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) { 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耗尽。
你可以在Startup类的ConfigureServices要领中,通过挪用IServiceCollection实例上的AddHttpClient扩展要领注册一个IHttpClientFactory范例的实例,如下:
public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews(); services.AddHttpClient(); }
将IHttpClientFactory实例注入到节制器可以通过如下代码将将IHttpClientFactory实例注入到节制器: