簡體   English   中英

C# HttpClient 或 socks4/5 代理?

[英]C# HttpClient tor socks4/5 proxy?

我可以使用以下代碼設置 http 代理:

public class CustomFlurlHttpClient : DefaultHttpClientFactory {
    public override HttpClient CreateClient(Url url, HttpMessageHandler m) {
        return base.CreateClient(url, CreateProxyHttpClientHandler("http://192.168.0.103:9090"));
    }

    private HttpClientHandler CreateProxyHttpClientHandler(string proxyUrl, string user = "", string passw = "") {
        NetworkCredential proxyCreds = null;
        var proxyUri = new Uri(proxyUrl);
        proxyCreds = new NetworkCredential (user, passw);
        var proxy = new WebProxy (proxyUri, false) {
            UseDefaultCredentials = false,
            Credentials = proxyCreds
        };
        var clientHandler = new HttpClientHandler {
            UseProxy = true,
            Proxy = proxy,
            PreAuthenticate = true,
            UseDefaultCredentials = false
        };
        if (user != "" && passw != "") {
            clientHandler.Credentials = new NetworkCredential (user, passw);
        }
        return clientHandler;
    }
}
class MainClass {
    public static void Main (string[] args) {
        run ();
        Console.ReadKey ();
    }

    async static void run() {
        using(FlurlClient client = new FlurlClient(c => { c.HttpClientFactory = new CustomFlurlHttpClient();})) {
            var result = await client.WithUrl("https://www.google.com").GetStringAsync();
            Console.WriteLine(result);
        };
    }
}

但不是襪子代理。 任何想法如何去做? 或支持異步/等待語法的任何其他(未棄用)rest 客戶端?

在 .NET 6 你可以像我在這里回答的那樣輕松地做到這一點

但這里有一個快速的答案:

var proxy = new WebProxy
{
    Address = new Uri("socks5://localhost:8080")
};
//proxy.Credentials = new NetworkCredential(); //Used to set Proxy logins. 
var handler = new HttpClientHandler
{
    Proxy = proxy
};
var httpClient = new HttpClient(handler);

或者配置一個命名的HttpClient使用IHttpClientFactory創建:

Services.AddHttpClient("WithProxy")
    .ConfigurePrimaryHttpMessageHandler(() =>
    {
        var proxy = new WebProxy
        {
            Address = new Uri("socks5://localhost:8080")
        };
        return new HttpClientHandler
        {
                    Proxy = proxy
         };
    });

當你注入IHttpClientFactory object 時:

httpClient = httpClientFactory.CreateClient("WithProxy");

可能的解決方案是使用提供襪子代理處理程序的Extreme.Net程序包。 例如,在上面的代碼中,我們需要使用以下代碼替換CreateClient方法:

        public override HttpClient CreateClient(Url url, HttpMessageHandler m)
    {
        var socksProxy = new Socks5ProxyClient("127.0.0.1", 9150);
        var handler = new ProxyHandler(socksProxy);
        return base.CreateClient(url, handler);
    }

而且有效!

一個更好的選擇是在自定義工廠中重寫CreateMessageHandler而不是CreateClient

public class CustomFlurlHttpClient : DefaultHttpClientFactory
{
    public override HttpMessageHandler CreateMessageHandler() {
        var socksProxy = new Socks5ProxyClient("127.0.0.1", 9150);
        return new ProxyHandler(socksProxy);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM