C# 许多代理使用IHttpClientFactory动态更改

C# 许多代理使用IHttpClientFactory动态更改,c#,proxy,httpclient,asp.net-core-3.1,C#,Proxy,Httpclient,Asp.net Core 3.1,在我的Startup.cs中,我创建了一个HttpClient服务列表: public void ConfigureServices(IServiceCollection services) { AddServiceProxyHttpClients(services); (...) } private void AddServiceProxyHttpClients(IServiceCollection services) { ProxyProvider

在我的
Startup.cs
中,我创建了一个
HttpClient
服务列表:

public void ConfigureServices(IServiceCollection services)
{
     AddServiceProxyHttpClients(services);

     (...)
}  
  
private void AddServiceProxyHttpClients(IServiceCollection services)
{
     ProxyProvider proxyProvider = new ProxyProvider();
     List<string> proxies = proxyProvider.GetProxies();
     foreach (var proxy in proxies)
     {
         services.AddHttpClient(proxy).ConfigurePrimaryHttpMessageHandler(() =>
         {
             return new HttpClientHandler
             {
                 Proxy = new WebProxy
                 {
                     Address = new Uri($"http://{proxy}:{"80"}"),
                     BypassProxyOnLocal = false,
                     UseDefaultCredentials = false,
                     Credentials = new NetworkCredential(userName: Configuration["Proxy:User"], password: Configuration["Proxy:Pass"])
                 },
                 UseProxy = true
             };
          });
     }
}
public void配置服务(IServiceCollection服务)
{
AddServiceProxyHttpClient(服务);
(...)
}  
专用void AddServiceProxyHttpClient(iSeries收集服务)
{
ProxyProvider ProxyProvider=新的ProxyProvider();
List proxies=proxyProvider.GetProxies();
foreach(代理中的var代理)
{
services.AddHttpClient(代理).ConfigurePrimaryHttpMessageHandler(()=>
{
返回新的HttpClientHandler
{
Proxy=新的WebProxy
{
地址=新Uri($“http://{proxy}:{“80”}”),
旁路ProxyOnLocal=false,
UseDefaultCredentials=false,
凭据=新网络凭据(用户名:配置[“代理:用户”]、密码:配置[“代理:通过”])
},
UseProxy=true
};
});
}
}
在我的HTTP客户端提供程序服务中,我使用它们如下,为每个请求使用新的代理:

public string GetHtmlDocumentWithProxy(string url)
{
    string html = string.Empty;

    using (HttpResponseMessage response = GetNewHttpClient().GetAsync(url).Result)
    {
        using (HttpContent content = response.Content)
        {
            html = content.ReadAsStringAsync().Result;
        }

        return html;
    }
}

private HttpClient GetNewHttpClient()
{
    List<string> proxies = _proxy.GetProxies();
    HttpClient client = _httpClientFactory.CreateClient(proxies[_proxyNumber]);
    client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/81.0");

    _proxyNumber = UpdateProxyNumber(_proxyNumber);

    return client;
}
公共字符串GetHtmlDocumentWithProxy(字符串url)
{
string html=string.Empty;
使用(HttpResponseMessage response=GetNewHttpClient().GetAsync(url).Result)
{
使用(HttpContent=response.content)
{
html=content.ReadAsStringAsync().Result;
}
返回html;
}
}
私有HttpClient GetNewHttpClient()
{
列表代理=_proxy.GetProxies();
HttpClient客户端=_httpClientFactory.CreateClient(代理[_proxyNumber]);
client.DefaultRequestHeaders.Add(“用户代理”、“Mozilla/5.0(Windows NT 10.0;WOW64;rv:49.0)Gecko/20100101 Firefox/81.0”);
_proxyNumber=UpdateProxyNumber(_proxyNumber);
返回客户;
}
它被多次调用该方法的多线程并行循环使用。问题是,有时我会遇到一个异常消息:

试图以其所禁止的方式访问插座 访问许可

据我所知,避免使用手持套接字出现问题的最佳方法是使用可重用的
HttpClient
。但在定义了处理程序和代理之后,我们无法更改它们

在ASP.NET核心中使用动态代理更改时,是否有更好的方法使用
IHttpClientFactory
HttpClient