ASP.Net Core 2.1和IHttpClientFactory

时间:2018-06-26 07:35:29

标签: http flurl

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吗?

1 个答案:

答案 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);
    }
}