在ASP.Net Core 2.1和IHttpClientFactory中Flurl客户端生命周期

Kar*_*ral 8 http flurl

Flurl声明使用单例客户端是推荐的模式:

HttpClient旨在实例化一次,并在应用程序的整个生命周期中重复使用.特别是在服务器应用程序中,为每个请求创建一个新的HttpClient实例将耗尽重负载下可用的套接字数量.这将导致SocketException错误.

但是,自Asp.Net Core 2.1以来,Net Core 2.1中的HttpClient生命周期更新规则.

当您使用HttpClientFactory请求HttpClient时,实际上每次都会获得一个新实例,这意味着我们不必担心会改变它的状态.此HttpClient可能(或可能不)使用池中的现有HttpClientHandler,因此使用现有的打开连接.

如何修改Flurl在引擎盖下使用IHttpClientFactory?我应该创建自定义Flurl settings.HttpClientFactory并通过MS IHttpClientFactory创建HttpClient吗?

Tod*_*ier 11

首先,应该注意MS的新版本HttpClientFactory旨在与ASP.NET Core 2.1及其内置DI容器一起使用.如果你没有将FlurlClients注入控制器或服务类,而是使用像这样的Flurl:

await url.GetJsonAsync();
Run Code Online (Sandbox Code Playgroud)

然后它甚至不相关.你应该落实Flurl的IHttpClientFactory使用MS的.它没有适当的上下文来使用DI容器,你最终会诉诸服务位置,这是一种反模式.那些你希望利用实际生活在较低级别的新套接字池功能:System.Net.Http.SocketsHttpHandler.HttpClientHander默认情况下,Flurl 用作其消息处理程序,但幸运的是,它已在.NET Core 2.1中重写,以将其所有工作推迟到SocketsHttpHandler默认情况下.换句话说,如果您在.NET Core 2.1应用程序中使用Flurl,那么您已经获得了MS一直在处理的所有新套接字管理好东西.

如果您正在使用FlurlClient在ASP.NET 2.1的核心应用程序明确,作为排序进行更换的HttpClient,并希望将其注入到你的类同时利用什么MS的HttpClientFactory所提供的,我建议建立HttpClientFactoryConfigureServices严格按照规定我MS,当你需要一个FlurlClient实例时,使用带有实例的构造函数HttpClient.例如,使用类型化客户端模式时,您的服务类可能如下所示:

public class MyService
{
    private readonly IFlurlClient _flurlClient;

    public MyService(HttpClient httpClient)
    {
        _flurlClient = new FlurlClient(httpClient);
    }
}
Run Code Online (Sandbox Code Playgroud)