Flurl指出推荐使用单例客户端模式:
HttpClient旨在实例化一次,并在应用程序的整个生命周期内重复使用。尤其是在服务器应用程序中,为每个请求创建一个新的HttpClient实例将耗尽繁重负载下可用的套接字数量。这将导致SocketException错误。
但是自从Asp.Net Core 2.1以来就有updated rules for HttpClient lifetime in Net Core 2.1。
当您使用HttpClientFactory请求HttpClient时,实际上每次都会获得一个新实例,这意味着我们不必担心会改变其状态。该HttpClient可以(也可以不)使用池中现有的HttpClientHandler,因此使用现有的开放连接。
如何修改Flurl以在后台使用IHttpClientFactory?我应该创建自定义Flurl的settings.HttpClientFactory
,然后通过MS IHttpClientFactory创建HttpClient吗?
答案 0 :(得分:9)
首先,应注意,MS的新HttpClientFactory
旨在与ASP.NET Core 2.1及其内置的DI容器结合使用。如果您没有将FlurlClient
注入到控制器或服务类中,而是使用Flurl,如下所示:
await url.GetJsonAsync();
那么它甚至不相关。您应该不实施Flurl's IHttpClientFactory以使用MS。它没有使用DI容器的适当上下文,您最终将诉诸服务位置,这是一种反模式。您想利用的这些新套接字池功能实际上处于较低级别:System.Net.Http.SocketsHttpHandler
。 Flurl默认使用HttpClientHander
作为其消息处理程序,但幸运的是,它已在.NET Core 2.1中重写,默认情况下将其所有工作推迟到SocketsHttpHandler
进行。换句话说,如果您在.NET Core 2.1应用程序中使用Flurl,则已经获得了MS一直在使用的所有新套接字管理工具。
如果您正在在ASP.NET Core 2.1应用程序中显式使用FlurlClient
,作为HttpClient
的替代品,并希望将其注入您的类中在充分利用MS HttpClientFactory
的优势的同时,我建议完全按照MS的规定在HttpClientFactory
中设置ConfigureServices
,并在需要FlurlClient
实例时使用具有HttpClient
实例的构造函数。例如,当使用类型化的客户机模式时,您的服务类可能如下所示:
public class MyService
{
private readonly IFlurlClient _flurlClient;
public MyService(HttpClient httpClient)
{
_flurlClient = new FlurlClient(httpClient);
}
}