首页 > 解决方案 > .Net Core HttpClientFactory 配置 HttpClientHandler

问题描述

我目前正在配置我的httpclientfactory这种方式

HttpClientHandler httpClientHandler = new HttpClientHandler()
{
    ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => { return true; }

};

serviceCollection.AddHttpClient("ignoreSSL", c =>
{}).ConfigurePrimaryHttpMessageHandler(h => httpClientHandler);

要禁用安全证书的验证,但是当执行太多请求时,我会收到此异常:

无法访问已处置的对象。对象名称:'SocketsHttpHandler'。

我目前httpclient以这种方式构建我的

HttpClient client = _httpClientFactory.CreateClient("ignoreSSL");

做测试,这是通过这种方式解决的httpclientfactory

HttpClient ad = new HttpClient(handler, false);

对于我寻找的更多信息,我找不到如何告诉httpclientfactory不让处理程序处置?

标签: .netasp.net-core.net-core

解决方案


问题是因为单个HttpClientHandler 实例用于所有请求。管理、汇集和回收处理程序是 HttpClientFactory 的工作。

看起来实际的问题是如何在使用 HttpClientFactory 时禁用证书验证。这需要配置它使用的客户端处理程序。

正如文档所示,这是使用ConfigurePrimaryHttpMessageHandler方法完成的。从方法的评论:

评论

委托应在每次调用时返回消息处理程序的新实例。

由该方法创建的处理程序将被添加到处理程序池中,并由其他处理程序(如 Polly 的重试处理程序)使用。HttpClientFactory 将回收旧的处理程序来处理 DNS 注册更改。

代码应如下所示:

services.AddHttpClient<HttpWrapper>("ignoreSSL")
        .ConfigurePrimaryHttpMessageHandler(() =>
        {
            return new HttpClientHandler
            {
                ServerCertificateCustomValidationCallback = (m, crt, chn, e) => true
            };
        });

推荐阅读