带代理的c#HttpClient

带代理的c#HttpClient,c#,proxy,httpclient,C#,Proxy,Httpclient,我使用HttpClient对一些资源执行了大量请求。 为了避免舔,我将其作为单个实例使用。像这样的事。。。 我想使用代理,那么如何为每个请求使用不同的代理呢 谢谢 公共类程序 { 私有静态HttpClient=新HttpClient(); 公共静态void Main(字符串[]args) { 控制台写入线(“启动连接”); 对于(int i=0;i,因此基本上要能够更改代理,您需要在HttpClientHandler 这里可以找到一个简单的例子: 这里还有一个: 我建议将HttpClientHa

我使用
HttpClient
对一些资源执行了大量请求。 为了避免舔,我将其作为单个实例使用。像这样的事。。。 我想使用代理,那么如何为每个请求使用不同的代理呢

谢谢

公共类程序
{
私有静态HttpClient=新HttpClient();
公共静态void Main(字符串[]args)
{
控制台写入线(“启动连接”);

对于(int i=0;i,因此基本上要能够更改代理,您需要在
HttpClientHandler

这里可以找到一个简单的例子:
这里还有一个:

我建议将
HttpClientHandler
保留在私有字段中,并在每次需要时使用引用来更改代理。
但请记住,如果需要同时使用不同的代理,则需要有多个
HttpClientHandler
类的实例

如果你需要我为这个做一个示例代码,请Ping我


谢谢。

您需要实现IWebProxy

这是一个非常好的示例

首先实现IWebProxy

public class MyProxy : IWebProxy {
public MyProxy() {  credentials = new NetworkCredential( user, password ); }
private NetworkCredential credentials;
public ICredentials Credentials
{
    get = > credentials;
    set = > throw new NotImplementedException();
}
private Uri proxyUri;
public Uri GetProxy( Uri destination )
{
    return proxyUri; // your proxy Uri
}
public bool IsBypassed( Uri host )
{
    return false;
}
private const string user = "yourusername";
private const string password = "password";}
然后将其提供给HttpClient中的处理程序

public class MyHttpClient {
internal static HttpResult httpMethod( ... )
{
    var _client = client();
    try
    {
        var message = new HttpRequestMessage( method, url );
        message.Content = new StringContent( content, Encoding.UTF8, "application/json" );
        var result = _client.SendAsync( message ).Result;// handle result
    }
    catch( Exception e ){}
}
private static HttpClient client()
{
    var httpClientHandler = new HttpClientHandler() { Proxy = new MyProxy() };
    var httpClient = new MyClient( new Uri( "baseurl" ), httpClientHandler );
    return httpClient;

其实很简单。
您只需在HttpClient构造函数中设置处理程序。
然后在处理程序中设置代理。
像这样:

public class Program
{

    public static async System.Threading.Tasks.Task Main(string[] args)
    {
        string url = "http://aspnetmonsters.com";

        using (System.Net.Http.HttpClientHandler handler = new System.Net.Http.HttpClientHandler()
        {
            Proxy = new System.Net.WebProxy("http://127.0.0.1:8888"),
            UseProxy = true,
        })
        {

            using (System.Net.Http.HttpClient hc = new System.Net.Http.HttpClient(handler))
            {
                System.Console.WriteLine("Starting connections");

                for (int i = 0; i < 10; i++)
                {
                    await hc.GetAsync(url);

                    // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent
                    hc.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148");
                    hc.DefaultRequestHeaders.Add("Accept-Language", "fr-FR, fr;q=0.9, en;q=0.8, it;q=0.7, *;q=0.5");
                    hc.DefaultRequestHeaders.Add("Referer", "https://www.baidu.com");

                    using (System.Net.Http.HttpResponseMessage response = await hc.GetAsync(url))
                    {
                        // using (var fs = new System.IO.MemoryStream())
                        // { await response.Content.CopyToAsync(fs); }
                        byte[] ba = await response.Content.ReadAsByteArrayAsync();

                    } // End Using response 

                } // Next i 

                System.Console.WriteLine("Ending connections");
            } // End Using hc 

        } // End Using handler 

        System.Console.WriteLine("--- Press any key to continue --- ");
        System.Console.ReadKey();
    } // End Task Main 

} // End Class Program 
公共类程序
{
公共静态异步System.Threading.Tasks.Task Main(字符串[]args)
{
字符串url=”http://aspnetmonsters.com";
使用(System.Net.Http.HttpClientHandler handler=new System.Net.Http.HttpClientHandler()
{
Proxy=新系统.Net.WebProxy(“http://127.0.0.1:8888"),
UseProxy=true,
})
{
使用(System.Net.Http.HttpClient hc=new System.Net.Http.HttpClient(handler))
{
System.Console.WriteLine(“启动连接”);
对于(int i=0;i<10;i++)
{
等待hc.GetAsync(url);
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent
hc.DefaultRequestHeaders.Add(“用户代理”、“Mozilla/5.0(iPad;CPU OS 12_2,如Mac OS X)AppleWebKit/605.1.15(KHTML,如Gecko)Mobile/15E148”);
添加(“接受语言”,“fr-fr,fr;q=0.9,en;q=0.8,it;q=0.7,*;q=0.5”);
hc.DefaultRequestHeaders.Add(“Referer”https://www.baidu.com");
使用(System.Net.Http.httpresponsemessageresponse=wait hc.GetAsync(url))
{
//使用(var fs=new System.IO.MemoryStream())
//{wait response.Content.CopyToAsync(fs);}
byte[]ba=wait response.Content.ReadAsByteArrayAsync();
}//结束使用响应
}//下一个我
系统控制台写入线(“结束连接”);
}//结束使用hc
}//结束使用处理程序
System.Console.WriteLine(“---按任意键继续---”);
System.Console.ReadKey();
}//结束主任务
}//结束类程序

为您拥有的每个代理创建并验证一个HttClient。然后使用与您的请求地址匹配的实例。但是,在创建HttpClientHandler后,如何将其设置为HttpClient的实例?@Sanja Melnichuk HttpClientHandler只需在构造时设置。如果保留引用,则无需修改即可重建HttpClientSo我有一个静态httpclient和HttpCleintHandler,我在不同的线程中使用它,每个线程使用它自己的代理,我如何确保我为即将到来的请求更改代理?@Sanja Melnichuk如果你更仔细地阅读我的原始答案,我说如果你想同时使用它,你需要有超过首先,要澄清的是,创建最昂贵的是HttpClientHandler,而不是HttpClient。这是错误的建议。虽然您可以在发送第一个请求之前更改附加到HttpClient的处理程序的代理,但任何后续更改代理的尝试都将导致引发异常。