.Net Core HttpClientFactory释放HttpClientHandler

6

我目前正在这样配置我的 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不要处理程序dispose的方法。


HttpClientFactory 的工作方式是“应该的”。必须定期清理池化的 HttpClientHandlers,以处理不断变化的 DNS 注册。这个错误是在哪里引起的? - Panagiotis Kanavos
为什么要像那样显式地创建单个 HttpClientHandler?这样会导致多个HttpClient都尝试使用相同连接,而不是连接池。如果您想禁用HTTPS证书错误,请使用HttpClientFactory的配置方法来设置处理程序属性。 - Panagiotis Kanavos
1
问题的原因是使用ConfigurePrimaryHttpMessageHandler每次返回相同的处理程序,而不是创建一个新的处理程序。 - Panagiotis Kanavos
1个回答

14

这个问题是由于所有请求都使用一个单独的HttpClientHandler实例引起的。HttpClientFactory的工作是管理、池化和回收处理程序。

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

正如文档所示, 这可以通过ConfigurePrimaryHttpMessageHandler方法来完成。从该方法的备注中可以看到:

备注

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

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

代码应该像这样:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接