C# HttpClient使用tor socks4/5代理?

6
我可以使用以下代码设置http代理:

我可以使用以下代码设置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);
        };
    }
}

但不是socks代理。有什么想法吗?或者有其他(不过时)支持异步/等待语法的REST客户端吗?


通常使用HttpClient可以做的任何事情,您都可以使用Flurl来完成。不幸的是,我找不到任何示例,并且个人对SOCKS也不太熟悉。也许把这个问题转化为一个HttpClient的问题,然后有人就会加入讨论。 - Todd Menier
3个回答

5
在.NET6中,你可以像我在这里回答的那样轻松实现它。
然而,这里有一个快速的回答:
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);

或者使用 IHttpClientFactory 配置一个命名的 HttpClient

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

当你注入 IHttpClientFactory 对象时:

httpClient = httpClientFactory.CreateClient("WithProxy");

3
可能的解决方案是使用提供socks代理处理程序的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);
    }

它能够正常工作!


不错!看起来这样会起作用,但是可以覆盖仅创建MessageHandler的过程,并让默认工厂创建HttpClient,我将在新答案中演示。 - Todd Menier
Extreme.Net已被弃用? - Toolkit
根据NuGet - 是的。 - abritov

2
一种稍微更好的选择是在自定义工厂中覆盖CreateMessageHandler而不是CreateClient
public class CustomFlurlHttpClient : DefaultHttpClientFactory
{
    public override HttpMessageHandler CreateMessageHandler() {
        var socksProxy = new Socks5ProxyClient("127.0.0.1", 9150);
        return new ProxyHandler(socksProxy);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接