C#でHttpClientを使用してプロキシを設定する方法

このステップバイステップガイドでC# HttpClientプロキシ統合をマスターしましょう。安全なウェブリクエストのための設定、認証、SSL処理、IPローテーションを学べます。
5 分読
How to Set a Proxy Using HttpClient blog image

このHttpClient C#プロキシ統合ガイドの最後には、以下を理解できるようになります:

  • HttpClientとは何か、そして.NETでHTTPリクエストを行う際の役割
  • C#でプロキシを使用すべき理由
  • HttpClientでプロキシを設定する方法
  • HttpClientでプロキシ認証、SSL証明書エラー、IPローテーションを処理する方法

早速見ていきましょう!

.NETにおけるHttpClientとは?

HttpClientは、.NETでHTTPリクエストを送信し、HTTPレスポンスを受信するためのクラスです。これはSystem.Net.Http名前空間の一部であり、.NET(つまりC#)のデフォルトのHTTPクライアントを表しています。

HttpClientは以下をサポートしています:

  • GET、POST、PUT、PATCH、DELETEを含むすべてのHTTPメソッド
  • 非同期通信
  • ヘッダーとクッキーのカスタマイズ
  • リクエストボディのカスタマイズ
  • プロキシ統合

これらの機能に加え、.NET標準ライブラリでの公式サポートにより、HttpClientはC#でのHTTPリクエストにおいて人気の選択肢となっています。

C# HttpClientでプロキシを設定すべき理由

ウェブスクレイピング、データ収集、その他のインターネット関連のタスクを行う際、オンラインでの身元を保護することが重要です。それを実現する一つの方法が、プロキシサーバーを経由してトラフィックをルーティングすることです。

プロキシサーバーは、あなたと目的のサイトの間の仲介役として機能し、HttpClientに以下の利点をもたらします:

  • IPと位置情報の隠匿:目的のサーバーには、あなたのIPではなくプロキシのIPが表示されます。
  • 機密性の向上:プロキシは実際の身元を隠すことでプライバシーの層を追加し、追跡を困難にします。
  • IPバンの回避:プロキシはレート制限を回避するのに役立ち、C#でのウェブスクレイピングにおいて基本的な要素です。
  • 地理的制限の回避:特定の地域にあるプロキシサーバーを使用することで、自宅から地理的に制限されたコンテンツにアクセスできます。

したがって、HttpClientでプロキシを使用することは、オンラインセキュリティを高めるだけでなく、スクレイピングタスクの信頼性も向上させます。

C#でHttpClientを使用したプロキシ設定:ステップバイステップガイド

以下の手順に従って、C#を使用して.NETのHttpClientにプロキシを統合する方法を学びましょう。

前提条件

開始する前に、以下の前提条件を満たしていることを確認してください:

  • C# IDE:Visual StudioまたはVisual Studio Codeのいずれかを使用できます。このガイドではC#拡張機能付きのVisual Studio Codeを使用します。
  • .NET 8以上がローカルにインストールされていること:最新バージョンの.NET、または.NET 8以上のLTSバージョンが必要です。このチュートリアルでは.NET 9を使用します。

必要なツールをお持ちでない場合は、上記のリンクからダウンロードし、インストールウィザードに従ってください。

ステップ#1:プロジェクトのセットアップ

.NETプロジェクト用の新しいフォルダを作成し、以下のコマンドでターミナルから移動します:

mkdir httpclient-proxy
cd httpclient-proxy

次に、その中に新しい.NETコンソールアプリケーションを初期化します:

dotnet run console

出力は以下のようになります:

The template "Console App" was created successfully.

次に、IDEでプロジェクトフォルダを開きます:

Program.cs in your C# Project

テンプレートによって生成されたファイルが表示されるはずで、最も重要なのはProgram.csです。現在、そこには単純な「Hello, World!」スクリプトが含まれています。このセクションの最後には、それがC# HttpClientプロキシ統合スクリプトになっているでしょう。

すべてが期待通りに動作することを確認するために、以下でC#アプリケーションを起動してみてください:

dotnet run

結果は以下のようになるはずです:

Hello, World!

素晴らしい!これでVisual Studio Codeで動作するC#プロジェクトができました。

ステップ#2:HttpClientのセットアップ

HttpClientを使用してリクエストを送信するために、以下のコード行をProgram.csに追加します:

using System.Net;

class Program
{
  static async Task Main()
  {
    // initialize an HttpClient instance
    using HttpClient client = new HttpClient();

    // the target URL
    string url = "https://httpbin.org/ip";

    // send an async GET request to the endpoint
    HttpResponseMessage response = await client.GetAsync(url);

    // read the response content as a string
    string responseBody = await response.Content.ReadAsStringAsync();

    // print the response to the console
    Console.WriteLine(responseBody);
  }
}

このスニペットはHttpClientインスタンスを初期化し、GetAsync()メソッドを使用してHTTPBin.ioプロジェクトの/ip GETエンドポイントに接続します。このAPIは呼び出し元のIPアドレスを返すため、プロキシ統合が期待通りに動作しているかを確認するのに最適な対象です。理由は?HttpClientにプロキシを統合すると、/ipエンドポイントから返されるIPは元のIPとは異なるはずだからです。

スクリプトを実行すると、出力は以下のようになるはずです:

{
  "origin": "55.17.80.196"
}

originに含まれるIPアドレスは、あなたの出口IPを表しています。

素晴らしい!有効なプロキシURLを取得する時です。

ステップ#3:プロキシの取得

HttpClientにプロキシを統合するには、まずプロキシサーバーへのアクセスが必要です。

多くのオンラインポータルが無料のプロキシURLを提供していますが、注意してください—プロキシインフラの運用には費用がかかります。あるサービスが無料プロキシを提供している場合、そのビジネスモデルが何であるかを考えてみてください。多くの場合、データの盗用やその他の疑わしい行為に関与しています。

そのため、無料プロキシは学習目的のみに使用し、本番環境での使用は避けることが最善です!

信頼性の高いプロキシが必要な場合は、無料トライアルや限定的な無料プランを提供している評判の良いプロバイダーを検討してください。

さて、典型的なプロキシURLは以下の形式に従います:

<protocol>://<host>:<port>

ここで:

  • protocolはプロキシのタイプを指定します(例:http、https、socks5など)
  • host:プロキシサーバーのドメインまたはIPアドレス
  • port:トラフィックがルーティングされるポート番号

この例では、プロキシURLが以下であると仮定します:

http://66.29.154.103:3128

それをProgram.csの変数に格納します:

string proxyUrl = "http://66.29.154.103:3128";

HttpClientでプロキシを使用する方法を見る時です!

ステップ#4:プロキシの統合

HttpClientでは、HttpClientHandlerクラスを通じてプロキシを指定できます。これは、HttpClientインスタンスによって送信されるHTTPリクエストに対する低レベルの制御を提供します。

特に、HttpClientHandlerには、プロキシサーバーの設定を含むWebProxyオブジェクトを受け取るProxyプロパティがあります:

WebProxy proxy = new WebProxy
{
  Address = new Uri(proxyUrl),
};

次に、proxyをHttpClientHandlerインスタンスに渡します:

HttpClientHandler handler = new HttpClientHandler
{
    Proxy = proxy,
};

そして最後に、HttpClientHandlerをHttpClientコンストラクタに渡します:

using HttpClient client = new HttpClient(handler);

素晴らしい!HttpClient C#プロキシ統合が完了しました。

ステップ#5:すべてをまとめる

最終的なHttpClientプロキシ統合スクリプトには以下が含まれるはずです:

using System.Net;

class Program
{
  static async Task Main()
  {
    // initialize a new proxy object
    string proxyUrl = "http://66.29.154.103:3128"; // replace with a valid proxy URL
    WebProxy proxy = new WebProxy
    {
      Address = new Uri(proxyUrl),
    };

    // define an HTTP client handler with the given proxy
    HttpClientHandler handler = new HttpClientHandler
    {
      Proxy = proxy,
    };

    // initialize an HttpClient instance with proxy integration
    using HttpClient client = new HttpClient(handler);

    // the target URL
    string url = "https://httpbin.org/ip";

    // send an async GET request to the endpoint
    HttpResponseMessage response = await client.GetAsync(url);

    // read the response content as a string
    string responseBody = await response.Content.ReadAsStringAsync();

    // print the response to the console
    Console.WriteLine(responseBody);
  }
}

スクリプトを実行します:

dotnet run

結果は以下のようになるはずです:

{
  "origin": "66.29.154.103"
}

/ipエンドポイントからのレスポンスにあるorigin属性は、プロキシサーバーのIPアドレスを表示していることに注意してください。これにより、あなたの実際のIPがプロキシの背後に正常に隠されたことが確認できます。

警告:無料のプロキシサーバーは通常、短命で信頼性が低いです。このガイドを読む頃には、選択したプロキシはもはや機能しないでしょう。コードをテストするには、スクリプトを実行する前にproxyUrlを有効な動作するプロキシURLに置き換えてください。

HttpClientプロキシ統合の高度なユースケース

C#のHttpClientでのプロキシ統合の基本を学びましたが、検討すべきより高度なシナリオも他にあります。

プロキシ認証

プレミアムプロキシは、認証されたユーザーにアクセスを制限するために認証で保護されています。特に、認証されたプロキシのURLは以下の形式に従います:

<protocol>://<username>:<password>@<host>:<port>

ここでusernameとpasswordは認証に使用される資格情報です。

HttpClientでは、プロキシ認証はWebProxyのCredentialsプロパティを使用して処理されます。このプロパティは、以下のようにNetworkCredentialオブジェクトを受け取ります:

WebProxy proxy = new WebProxy
{
  Address = new Uri(proxyUrl),
  // specify proxy authentication
  Credentials = new NetworkCredential("<username>", "<password>"),
};

認証されたプロキシURLから<username>と<password>を抽出し、上記のコードで置き換えてください。

したがって、認証されたプロキシ統合のコードは以下のようになります:

using System.Net;

class Program
{
  static async Task Main()
  {
    // initialize a new proxy object
    string proxyUrl = "<protocol>://<host>:<port>";
    WebProxy proxy = new WebProxy
    {
      Address = new Uri(proxyUrl),
      // specify proxy authentication
      Credentials = new NetworkCredential("<username>", "<password>"),
    };

    // define an HTTP client handler with the given proxy
    HttpClientHandler handler = new HttpClientHandler
    {
      Proxy = proxy,
    };

    // initialize an HttpClient instance with authenticated proxy integration
    using HttpClient client = new HttpClient(handler);

    // the target URL
    string url = "https://httpbin.org/ip";

    // send an async GET request to the endpoint
    HttpResponseMessage response = await client.GetAsync(url);

    // read the response content as a string
    string responseBody = await response.Content.ReadAsStringAsync();

    // print the response to the console
    Console.WriteLine(responseBody);
  }
}

SSL証明書の問題を回避する

HttpClientでプロキシを設定する際、以下のSSL証明書検証エラーによりリクエストが失敗することがあります:

Unhandled exception. System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception.
 ---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid because of errors in the certificate chain: UntrustedRoot

これは通常、プロキシが自己署名のSSL証明書を使用している場合に発生します。

プロキシサーバーを信頼している場合—そしてその場合に限り、以下のアプローチを使用してSSL検証を無効にし、この問題を回避できます:

HttpClientHandler handler = new HttpClientHandler();
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
handler.ServerCertificateCustomValidationCallback = (httpRequestMessage, cert, cetChain, policyErrors) =>
{
  return true;
};

using HttpClient client = new HttpClient(handler);

上記のスニペットは、常にtrueを返すカスタムコールバックでデフォルトの証明書検証動作を上書きします。

注意:SSL検証を無効にすると、接続がMITM(中間者)攻撃に対して脆弱になります。このアプローチは、プロキシを完全に信頼し、セキュリティリスクを認識している場合にのみ使用してください。

プロキシローテーションの実装

同じプロキシサーバーを繰り返し使用していると、対象サイトが最終的にそのIPアドレスをブロックする可能性があります。それを避けるために、各リクエストごとにプロキシサーバーをローテーションさせることで、毎回異なるプロキシサーバーを使用するようにできます。

プロキシローテーションを実装するには、以下の手順に従います

  1. 多くのプロキシURLをリストに入力する
  2. 各リクエストの前にランダムにプロキシURLを選択する
  3. 選択したプロキシURLをHttpClientに設定する

上記のアルゴリズムは以下のスニペットに変換されます:

using System.Net;

class Program
{  
  static async Task Main()
  {
    // get a random proxy URL
    string selectedProxyUrl = GetRandomProxyUrl();

    // configure the random proxy
    HttpClientHandler handler = new HttpClientHandler
    {
      Proxy = new WebProxy
      {
        Address = new Uri(selectedProxyUrl),
      },
    };

    // perform a GET request through the random proxy
    using HttpClient client = new HttpClient(handler);
    string url = "https://httpbin.org/ip";
    HttpResponseMessage response = await client.GetAsync(url);

    // read the response content as a string and print it
    string responseBody = await response.Content.ReadAsStringAsync();
    Console.WriteLine(responseBody);
  }

  static string GetRandomProxyUrl()
  {
    // the list of proxy URL to rotate from
    List<string> proxyUrls = new List<string>
        {
            "<protocol_1>://<proxy_host_1>:<port_1>",
            // ...
            "<protocol_n>://<proxy_host_n>:<port_n>",
        };

    // return a random proxy URL from the list
    Random random = new Random();
    int index = random.Next(proxyUrls.Count);
    return proxyUrls[index];
  }
}

このアプローチの主な欠点は以下の通りです:

  • 定型コードが必要になる
  • 信頼できるプロキシサーバーのプールへのアクセスが必要で、通常コストがかかる

幸いなことに、C#でIPアドレスをローテーションするより効率的な解決策があります!

Bright Dataは、出口IPアドレスを自動的にローテーションするローテーションプロキシを提供しており、手動でのプロキシローテーションの必要性をなくします。約1億のIPを誇り、195か国で利用可能で、優れたネットワーク稼働時間を持ち、99.9%の成功率を保証します。

次の章では、HttpClientでBright Dataのローテーションプロキシを使い始める方法を学びます。

HttpClientでBright Dataのプロキシを使用する

Bright Dataは世界最大級のプロキシサーバーの一つを運営しており、フォーチュン500企業や50,000+の顧客にサービスを提供しています。この世界規模のプロキシネットワークには以下が含まれます:

以下の手順に従って、C#のHttpClientでBright Dataのレジデンシャルプロキシを使用する方法を学びましょう。

すでにアカウントをお持ちの場合は、Bright Dataにログインしてください。お持ちでない場合は、アカウントを作成すると、ログイン後にユーザーダッシュボードに移動します:

Bright Data's dashboard after login

「View proxy products」ボタンをクリックして進みます:

Clicking on view proxy products

「Proxies & Scraping Infrastructure」ページにリダイレクトされます:

Proxies & Scraping Infrastructure main page

下にスクロールして「Residential Proxies」カードを見つけます。「Get started」ボタンをクリックします:

Getting started with residential proxies

レジデンシャルプロキシの設定ページで、ウィザードに従ってニーズに合わせてサービスをカスタマイズします。ご質問がある場合は、遠慮なく24時間365日のサポートにお問い合わせください:

Customizing the service based on your needs

「Access parameters」タブに移動して、プロキシのホスト、ポート、ユーザー名、パスワードを取得します:

The access parameters for your new zone

「Host」フィールドにはポートが含まれることに注意してください。

必要な詳細情報が揃ったので、プロキシURLを構築し、C#のWebProxyオブジェクトで使用します:

WebProxy proxy = new WebProxy
{
  Address = new Uri("http://<brightdata_proxy_host>:<brightdata_proxy_port>"),
  Credentials = new NetworkCredential("<brightdata_proxy_username>", "<brightdata_proxy_password>"),
};

<...>のプレースホルダーをBright Dataのプロキシ情報に置き換えてください。

「Active proxy」設定を切り替え、残りの指示に従えば、準備完了です!

以下のC#コードスニペットを使用して、Bright DataのプロキシをHttpClientに統合します:

using System.Net;

class Program
{
  static async Task Main()
  {
    // initialize a new proxy object
    WebProxy proxy = new WebProxy
    {
      // TODO: replace the placeholders with your Bright Data's proxy info
      Address = new Uri("http://<brightdata_proxy_host>:<brightdata_proxy_port>"),
      Credentials = new NetworkCredential("<brightdata_proxy_username>", "<brightdata_proxy_password>"),
    };

    // define an HTTP client handler with the given proxy
    HttpClientHandler handler = new HttpClientHandler
    {
      Proxy = proxy,
    };

    // disable SSL verification
    handler.ClientCertificateOptions = ClientCertificateOption.Manual;
    handler.ServerCertificateCustomValidationCallback = (httpRequestMessage, cert, cetChain, policyErrors) =>
    {
      return true;
    };

    // initialize an HttpClient instance with proxy integration
    using HttpClient client = new HttpClient(handler);

    // the target URL
    string url = "https://httpbin.org/ip";

    // send an async GET request to the endpoint
    HttpResponseMessage response = await client.GetAsync(url);

    // read the response content as a string
    string responseBody = await response.Content.ReadAsStringAsync();

    // print the response to the console
    Console.WriteLine(responseBody);
  }
}

上記のスクリプトを実行するたびに、異なる出口IPが表示されます。

Bright Dataの自動ローテーションプロキシを使えば、HttpClientプロキシローテーションがこれまでになく簡単になります!

まとめ

このプロキシ統合チュートリアルでは、プロキシを使用することが重要な理由と、C#のHttpClientにプロキシを統合する方法を学びました。.NETのデフォルトHTTPクライアントライブラリであるHttpClientでプロキシを設定することがいかに簡単かを発見しました。

このガイドを通じて、無料のプロキシサービスに頼ることがなぜリスクが高いのかも理解できました。代わりに、評判の良いプロキシプロバイダーから信頼性の高いプロキシを使用する必要があります。そして、市場で最高のローテーションプロキシプロバイダーについては、Bright Data以外に探す必要はありません。

アカウントを作成して、今すぐ無料で私たちのプロキシをテストしましょう!