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