15

Flurl 指出使用单例客户端是推荐的模式:

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

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

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

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

4

1 回答 1

19

首先,需要注意的是,MS 的 newHttpClientFactory旨在与 ASP.NET Core 2.1 及其内置的 DI 容器结合使用。如果您没有将FlurlClients 注入控制器或服务类,而是像这样使用 Flurl:

await url.GetJsonAsync();

那么它甚至不相关。您不应该实现Flurl的 IHttpClientFactory来使用 MS。它没有使用 DI 容器的正确上下文,您最终将求助于服务位置,这是一种反模式。您想要利用的那些新的套接字池功能实际上存在于较低级别:System.Net.Http.SocketsHttpHandler. FlurlHttpClientHander默认用作其消息处理程序,但幸运的是,它已在 .NET Core 2.1 中被重写,以将其所有工作推迟到SocketsHttpHandler默认情况下。换句话说,如果您在 .NET Core 2.1 应用程序中使用 Flurl,那么您已经获得了 MS 一直在开发的所有新的套接字管理好东西

如果您在ASP.NET Core 2.1 应用程序中显式使用,FlurlClient以替代. MS,当您需要实例时,请使用带有实例的构造函数。例如,当使用类型化客户端模式时,您的服务类可能如下所示:HttpClientHttpClientFactoryHttpClientFactoryConfigureServicesFlurlClientHttpClient

public class MyService
{
    private readonly IFlurlClient _flurlClient;

    public MyService(HttpClient httpClient)
    {
        _flurlClient = new FlurlClient(httpClient);
    }
}
于 2018-07-01T16:59:03.803 回答