備忘録

備忘録

C#でHttpClientにSOCKS Proxyを利用する方法

Ⅰ. はじめに

タイトルの通り「C#でHttpClientにSOCKS プロクシを利用する方法」です。

Ⅱ. やり方(DotNet4.SocksProxyを利用する方法)

DotNet4.SocksProxy を利用します。
DotNet4.SocksProxy は SOCKS4/5 に対応しています。(2018/02/21時点)

1. NuGetから DotNet4.SocksProxy をインストールする
Install-Package DotNet4.SocksProxy
2. サンプルプログラム
using com.LandonKey.SocksWebProxy;
using com.LandonKey.SocksWebProxy.Proxy;
using System;
using System.Net;
using System.Net.Http;
using System.Net.Sockets;

namespace Test
{
  class Program
  {
    private static int GetNextFreePort()
    {
      var listener = new TcpListener(IPAddress.Loopback, 0);
      listener.Start();
      var port = ((IPEndPoint)listener.LocalEndpoint).Port;
      listener.Stop();

      return port;
    }

    static void Main(string[] args)
    {
      var proxy = new SocksWebProxy(new ProxyConfig(
        IPAddress.Parse("127.0.0.1"),
        GetNextFreePort(),
        IPAddress.Parse("127.0.0.1"),
        9050,
        ProxyConfig.SocksVersion.Five));

      var handler = new HttpClientHandler();
      handler.Proxy = proxy;
      var client = new HttpClient(handler);

      Console.WriteLine(client.GetStringAsync("https://api.ipify.org").Result);
    }
  }
}
3. 実行結果

f:id:kagasu:20180221085227p:plain

Ⅲ. やり方(SocksSharpを利用する方法)

SocksSharp を利用します。
SocksSharp は SOCKS4/4a/5 に対応しています。(2018/02/21時点)
POSTが正常に出来ない、Streamに対応していない等バグが多いです。(2018/02/21時点)

1. NuGetから SocksSharp をインストールする
Install-Package SocksSharp
2. サンプルプログラム
using SocksSharp;
using SocksSharp.Proxy;
using System;
using System.Net.Http;

namespace HttpClientTest
{
  class Program
  {
    static void Main(string[] args)
    {
      var settings = new ProxySettings()
      {
        Host = "127.0.0.1",
        Port = 1080
      };

      var handler = new ProxyClientHandler<Socks5>(settings);
      var client = new HttpClient(handler);
      Console.WriteLine(client.GetStringAsync("https://api.ipify.org").Result);
    }
  }
}
3. 実行結果

f:id:kagasu:20170826174528p:plain