.Net Core HttpClientFactory处理HttpClientHandler

时间:2019-01-18 15:17:11

标签: .net asp.net-core .net-core

我目前正在以这种方式配置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不要让处理程序处置?

1 个答案:

答案 0 :(得分:2)

引起此问题的原因是单个 HttpClientHandler实例用于所有请求。管理,缓冲和回收处理程序是HttpClientFactory的工作。

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

As the documentation shows这是使用ConfigurePrimaryHttpMessageHandler方法完成的。从方法的注释中:

  

备注

     

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

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

代码应如下所示:

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