首页 > 解决方案 > 我可以使用 SocketHttpHandler 代替 HttpMessageHandler 吗?

问题描述

Flurl 默认配置为使用HttpMessageHandler。但是,我的应用程序使用 .NET Core 3.1,我知道这个框架对新的SocketHttpHandler类有更好的支持。那么我可以创建一个这样的自定义类吗?


public class CustomHttpClientFactory : DefaultHttpClientFactory
{
    #region Overrides of DefaultHttpClientFactory

    /// <summary>
    ///     Override in custom factory to customize the creation of HttpClientHandler used in all Flurl HTTP calls.
    ///     In order not to lose Flurl.Http functionality, it is recommended to call base.CreateMessageHandler and
    ///     customize the result.
    /// </summary>
    public override HttpMessageHandler CreateMessageHandler() => new SocketsHttpHandler
    {
        AllowAutoRedirect           = false,
        ConnectTimeout              = TimeSpan.FromMinutes(1),
        PooledConnectionLifetime    = TimeSpan.FromMinutes(1),
        PooledConnectionIdleTimeout = TimeSpan.FromMinutes(1),
        MaxConnectionsPerServer     = 20,
        SslOptions = new SslClientAuthenticationOptions
        {
            AllowRenegotiation                  = false,
            RemoteCertificateValidationCallback = (sender, certificate, chain, errors) => true
        }
    };

    #endregion
}

OnStartup中的配置

FlurlHttp.ConfigureClient(AppConstants.ServiceUrl, cli =>
                {
                    cli.BaseUrl = AppConstants.ServiceUrl;

                    cli.Configure(settings =>
                    {
                        settings.ConnectionLeaseTimeout = TimeSpan.FromSeconds(60);
                        settings.Timeout                = TimeSpan.FromSeconds(60);
                        settings.HttpClientFactory      = new CustomHttpClientFactory();
                    }).WithHeaders(headers);
                });

标签: flurl

解决方案


HttpMessageHandler是一个抽象类。Flurl 默认使用的实现是HttpClientHandler. 我猜这就是你想要换掉的SocketsHttpHandler

幸运的是,.NET 团队也更喜欢后一种实现,这就是为什么HttpClientHandler现在将其所有工作委托给SocketsHttpHandler.

换句话说,如果您在支持SocketsHttpHandler(.NET Core 2.1 或更高版本)的平台上,则默认使用它。不需要定制工厂。

也就是说,如果您需要使用一些自定义配置来初始化处理程序,那么我认为您所做的很好。


推荐阅读