C# WebClientの使い方と代替手段|ダウンロード・POST通信・エラー対策まで解説
はじめに
C#でWeb上のデータを取得したり、ファイルをダウンロードしたりする方法を調べると、よく出てくるのがWebClientです。
WebClientは、URLを指定してHTMLや画像、JSON、ファイルなどを簡単に取得できるクラスで、特に.NET Framework時代のサンプルコードでは頻繁に使われてきました。
一方で、現在の.NETではWebClientよりもHttpClientの利用が推奨されています。そのため、「C# WebClientはまだ使えるのか」「新規開発でも使ってよいのか」「HttpClientへ移行すべきなのか」と迷う方も多いでしょう。
この記事では、C#のWebClientの基本的な使い方から、ファイルダウンロード、POST通信、エラー対策、注意点、代替手段であるHttpClientまでまとめて解説します。
1. C# WebClientとは?できることと現在の位置づけ
1-1. WebClientの概要と主な用途
WebClientは、C#でHTTP通信を簡単に行うためのクラスです。System.Net名前空間に含まれており、URLを指定するだけでWebページの内容を取得したり、ファイルをダウンロードしたりできます。
たとえば、次のような処理に使われます。
C#using System.Net;
using (var client = new WebClient())
{
string html = client.DownloadString("https://example.com");
Console.WriteLine(html);
}
このように、少ないコードでHTTP GET通信を実行できるのがWebClientの特徴です。
1-2. WebClientでできること:GET・ダウンロード・POST・アップロード
WebClientでは、主に次のような処理ができます。
C#using System.Net;
using System.Collections.Specialized;
using (var client = new WebClient())
{
string html = client.DownloadString("https://example.com");
byte[] data = client.DownloadData("https://example.com/image.png");
client.DownloadFile("https://example.com/file.zip", "file.zip");
string response = client.UploadString(
"https://example.com/api",
"POST",
"{\"name\":\"taro\"}"
);
var values = new NameValueCollection
{
{ "user", "taro" },
{ "password", "secret" }
};
byte[] result = client.UploadValues("https://example.com/login", values);
}
GET通信、ファイルダウンロード、文字列POST、フォーム送信など、基本的なHTTP通信を扱えます。
1-3. WebClientが使われる場面と初心者が検索する理由
WebClientはコードが短く、直感的に使えるため、C#初心者がHTTP通信を学ぶときによく使われます。
特に次のような目的で検索されます。
C#でWebページのHTMLを取得したい
URLから画像やZIPファイルを保存したい
APIにPOST通信したい
JSONを送信したい
HTTPエラーの対処方法を知りたい
HttpClientとの違いを知りたい
古いサンプルコードや業務システムでは、今でもWebClientが使われていることがあります。
1-4. .NET 6以降でWebClientが非推奨とされる理由
WebClientは完全に使えなくなったわけではありませんが、現在の.NETでは新規開発に推奨されていません。
理由は、HttpClientのほうが非同期処理、タイムアウト制御、ヘッダー設定、拡張性、テスト容易性などの面で優れているためです。
また、WebClientの非同期処理はイベントベースで、現代的なasync/awaitとの相性があまりよくありません。
1-5. 新規開発ではHttpClientを使うべきか
新規開発では、基本的にHttpClientを使うべきです。
ただし、既存の.NET Frameworkアプリで短い処理を保守するだけなら、WebClientをそのまま使う判断もあります。
目安は次のとおりです。
| 用途 | 推奨 |
|---|---|
| 新規開発 | HttpClient |
| .NET 6以降 | HttpClient |
| 既存の.NET Framework保守 | WebClient継続も可 |
| 簡単な一時ツール | WebClientでも可 |
| API通信が多いアプリ | HttpClient |
2. C# WebClientの基本的な使い方
2-1. WebClientを使うために必要な名前空間
WebClientを使うには、次の名前空間を指定します。
C#using System.Net;
フォームデータを送信する場合は、次も使います。
C#using System.Collections.Specialized;
文字コードを指定する場合は、次を使います。
C#using System.Text;
2-2. WebClientインスタンスの作成とDisposeの基本
WebClientは通信リソースを使用するため、使い終わったらDisposeするのが基本です。
C#using (var client = new WebClient())
{
string result = client.DownloadString("https://example.com");
Console.WriteLine(result);
}
usingを使うことで、処理終了後に自動的にリソースが解放されます。
2-3. DownloadStringでWebページのHTMLを取得する
WebページのHTMLを文字列として取得するには、DownloadStringを使います。
C#using System;
using System.Net;
class Program
{
static void Main()
{
using (var client = new WebClient())
{
string html = client.DownloadString("https://example.com");
Console.WriteLine(html);
}
}
}
HTMLやテキスト、JSONなど、文字列として取得できるレスポンスに向いています。
2-4. DownloadDataでバイナリデータを取得する
画像やPDFなどのバイナリデータを取得する場合は、DownloadDataを使います。
C#using System.IO;
using System.Net;
using (var client = new WebClient())
{
byte[] data = client.DownloadData("https://example.com/image.png");
File.WriteAllBytes("image.png", data);
}
DownloadDataはレスポンス全体をメモリ上に読み込むため、大容量ファイルでは注意が必要です。
2-5. 文字化けを防ぐEncoding設定の方法
日本語サイトを取得したときに文字化けする場合は、Encodingを指定します。
C#using System.Net;
using System.Text;
using (var client = new WebClient())
{
client.Encoding = Encoding.UTF8;
string html = client.DownloadString("https://example.com");
Console.WriteLine(html);
}
Shift_JISのサイトを取得する場合は、次のように指定します。
C#client.Encoding = Encoding.GetEncoding("shift_jis");
.NET Coreや.NET 5以降でShift_JISを使う場合は、コードページプロバイダーの登録が必要になることがあります。
C#Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
client.Encoding = Encoding.GetEncoding("shift_jis");
2-6. Headersを設定してUser-Agentや認証情報を送る方法
一部のWebサイトやAPIでは、User-Agentがないと403エラーになることがあります。その場合はHeadersを設定します。
C#using System.Net;
using (var client = new WebClient())
{
client.Headers.Add("User-Agent", "Mozilla/5.0");
string result = client.DownloadString("https://example.com");
}
認証ヘッダーを追加する場合は、次のように書けます。
C#client.Headers.Add("Authorization", "Bearer your-token");
3. WebClientでファイルをダウンロードする方法
3-1. DownloadFileでURLからファイルを保存する基本コード
URLからファイルを保存するには、DownloadFileを使います。
C#using System.Net;
using (var client = new WebClient())
{
client.DownloadFile(
"https://example.com/sample.zip",
@"C:\Temp\sample.zip"
);
}
第1引数にダウンロード元URL、第2引数に保存先パスを指定します。
3-2. 保存先パスを指定するときの注意点
保存先のフォルダが存在しない場合、エラーになります。事前にフォルダを作成しておきましょう。
C#using System.IO;
using System.Net;
string dir = @"C:\Temp";
string path = Path.Combine(dir, "sample.zip");
Directory.CreateDirectory(dir);
using (var client = new WebClient())
{
client.DownloadFile("https://example.com/sample.zip", path);
}
また、同名ファイルが存在する場合は上書きされる可能性があります。必要に応じて存在チェックを行いましょう。
C#if (!File.Exists(path))
{
client.DownloadFile("https://example.com/sample.zip", path);
}
3-3. DownloadFileAsyncで非同期ダウンロードする方法
非同期でファイルをダウンロードするには、DownloadFileAsyncを使います。
C#using System;
using System.Net;
var client = new WebClient();
client.DownloadFileCompleted += (sender, e) =>
{
if (e.Error != null)
{
Console.WriteLine("エラー: " + e.Error.Message);
}
else
{
Console.WriteLine("ダウンロード完了");
}
client.Dispose();
};
client.DownloadFileAsync(
new Uri("https://example.com/sample.zip"),
"sample.zip"
);
Console.ReadLine();
DownloadFileAsyncはイベントベースの非同期処理です。現在のC#では、HttpClientとasync/awaitを使うほうが自然です。
3-4. ダウンロード進捗を表示する方法
進捗を表示するには、DownloadProgressChangedイベントを使います。
C#using System;
using System.Net;
var client = new WebClient();
client.DownloadProgressChanged += (sender, e) =>
{
Console.WriteLine($"{e.ProgressPercentage}%");
};
client.DownloadFileCompleted += (sender, e) =>
{
Console.WriteLine("完了");
client.Dispose();
};
client.DownloadFileAsync(
new Uri("https://example.com/sample.zip"),
"sample.zip"
);
Console.ReadLine();
e.ProgressPercentageで進捗率を取得できます。
3-5. ダウンロード完了時の処理を書く方法
ダウンロード完了時の処理は、DownloadFileCompletedイベントに書きます。
C#client.DownloadFileCompleted += (sender, e) =>
{
if (e.Cancelled)
{
Console.WriteLine("キャンセルされました");
}
else if (e.Error != null)
{
Console.WriteLine("失敗: " + e.Error.Message);
}
else
{
Console.WriteLine("正常に完了しました");
}
};
エラー、キャンセル、正常完了を分けて処理するのがポイントです。
3-6. 大容量ファイルを扱うときの注意点
大容量ファイルを扱う場合、DownloadDataのように全データをメモリに読み込む方法は避けたほうが安全です。
ファイル保存が目的なら、DownloadFileまたはHttpClientのストリーム処理を使いましょう。
また、次の点にも注意が必要です。
タイムアウト対策
通信失敗時のリトライ
保存先ディスク容量
途中キャンセル処理
UIアプリでのフリーズ対策
新規開発で大容量ダウンロードを行うなら、HttpClientを使ったストリーム保存がおすすめです。
4. WebClientでPOST通信を行う方法
4-1. UploadStringでJSONや文字列データをPOSTする
JSONをPOSTする場合は、UploadStringを使います。
C#using System;
using System.Net;
using System.Text;
using (var client = new WebClient())
{
client.Encoding = Encoding.UTF8;
client.Headers.Add("Content-Type", "application/json");
string json = "{\"name\":\"taro\",\"age\":30}";
string response = client.UploadString(
"https://example.com/api/users",
"POST",
json
);
Console.WriteLine(response);
}
UploadStringは、JSONやXMLなどの文字列データ送信に向いています。
4-2. UploadValuesでフォームデータを送信する
HTMLフォームのようなデータを送信する場合は、UploadValuesを使います。
C#using System;
using System.Collections.Specialized;
using System.Net;
using System.Text;
using (var client = new WebClient())
{
var values = new NameValueCollection
{
{ "username", "taro" },
{ "password", "secret" }
};
byte[] responseBytes = client.UploadValues(
"https://example.com/login",
"POST",
values
);
string response = Encoding.UTF8.GetString(responseBytes);
Console.WriteLine(response);
}
UploadValuesでは、application/x-www-form-urlencoded形式でデータが送信されます。
4-3. Content-Typeを設定する方法
Content-Typeは、送信するデータ形式に応じて設定します。
JSONの場合は次のように指定します。
C#client.Headers.Add("Content-Type", "application/json");
フォームデータの場合は通常、UploadValuesが適切に処理しますが、明示するなら次のように書きます。
C#client.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
4-4. Basic認証やBearerトークンを付与する方法
Basic認証を使う場合は、Credentialsを設定します。
C#using System.Net;
using (var client = new WebClient())
{
client.Credentials = new NetworkCredential("user", "password");
string result = client.DownloadString("https://example.com/private");
}
Bearerトークンを使う場合は、Authorizationヘッダーを追加します。
C#client.Headers.Add("Authorization", "Bearer your-access-token");
API通信では、Bearerトークンを使うケースが多くあります。
4-5. POST通信のレスポンスを取得する方法
UploadStringは、サーバーから返されたレスポンスを文字列で受け取れます。
C#string response = client.UploadString(url, "POST", json);
Console.WriteLine(response);
UploadValuesの場合は、レスポンスがbyte[]で返ります。
C#byte[] bytes = client.UploadValues(url, values);
string response = Encoding.UTF8.GetString(bytes);
レスポンスがJSONの場合は、必要に応じてJSONライブラリでデシリアライズします。
4-6. GET通信とPOST通信の使い分け
GETとPOSTは用途が異なります。
| 通信方式 | 主な用途 |
|---|---|
| GET | データの取得 |
| POST | データの送信・登録・更新 |
| PUT | データの更新 |
| DELETE | データの削除 |
検索条件の取得やページ表示にはGET、ログインや登録、APIへのデータ送信にはPOSTを使うのが一般的です。
5. WebClientで発生しやすいエラーと対策
5-1. WebExceptionの基本的な捕捉方法
WebClientの通信エラーは、主にWebExceptionとして発生します。
C#using System;
using System.Net;
try
{
using (var client = new WebClient())
{
string result = client.DownloadString("https://example.com/notfound");
}
}
catch (WebException ex)
{
Console.WriteLine("通信エラー: " + ex.Message);
}
HTTPステータスコードを確認するには、ResponseをHttpWebResponseにキャストします。
C#catch (WebException ex)
{
if (ex.Response is HttpWebResponse response)
{
Console.WriteLine((int)response.StatusCode);
Console.WriteLine(response.StatusCode);
}
}
5-2. 404・403・500などHTTPステータスコード別の対処法
代表的なHTTPステータスコードと対処法は次のとおりです。
| ステータス | 意味 | 対処法 |
|---|---|---|
| 400 | 不正なリクエスト | パラメータやJSON形式を確認 |
| 401 | 認証エラー | 認証情報を確認 |
| 403 | アクセス禁止 | 権限、User-Agent、APIキーを確認 |
| 404 | 見つからない | URLを確認 |
| 429 | リクエスト過多 | 時間を置く、レート制限を確認 |
| 500 | サーバーエラー | サーバー側の状態を確認 |
| 503 | 一時的に利用不可 | リトライを検討 |
エラー時はステータスコードとレスポンス本文をログに残すと原因調査がしやすくなります。
5-3. タイムアウトが発生する原因と対策
WebClientには直接タイムアウトを設定するプロパティがありません。必要な場合は、WebClientを継承してGetWebRequestをオーバーライドします。
C#using System;
using System.Net;
public class TimeoutWebClient : WebClient
{
public int Timeout { get; set; } = 10000;
protected override WebRequest GetWebRequest(Uri address)
{
WebRequest request = base.GetWebRequest(address);
request.Timeout = Timeout;
return request;
}
}
使い方は次のとおりです。
C#using (var client = new TimeoutWebClient())
{
client.Timeout = 5000;
string result = client.DownloadString("https://example.com");
}
ただし、タイムアウト制御を重視するならHttpClientのほうが扱いやすいです。
5-4. SSL/TLSエラーが出る場合の確認ポイント
SSL/TLSエラーが出る場合は、次の点を確認します。
接続先の証明書が有効か
OSや.NET Frameworkが古すぎないか
TLS 1.2以上が必要ではないか
社内プロキシやセキュリティソフトが通信を遮断していないか
古い.NET Frameworkでは、TLS 1.2を明示的に指定する必要がある場合があります。
C#ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
ただし、証明書検証を無効化するような実装はセキュリティ上避けるべきです。
5-5. 「WebClientは同時I/O操作をサポートしません」の原因
WebClientでは、同じインスタンスで複数の通信を同時に実行できません。
たとえば、1つのWebClientで複数のDownloadFileAsyncを同時に呼び出すとエラーになります。
対策は、通信ごとに別のインスタンスを使うことです。
C#using (var client1 = new WebClient())
using (var client2 = new WebClient())
{
// それぞれ別の通信に使う
}
大量の並列通信が必要な場合は、HttpClientを使うほうが適しています。
5-6. 文字化け・日本語が正しく取得できない場合の対策
文字化けする場合は、まず文字コードを確認します。
UTF-8なら次のように指定します。
C#client.Encoding = Encoding.UTF8;
Shift_JISなら次のように指定します。
C#Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
client.Encoding = Encoding.GetEncoding("shift_jis");
また、レスポンスヘッダーやHTMLのcharset指定と、実際の文字コードが一致しているかも確認しましょう。
5-7. プロキシ環境で通信できない場合の対策
社内ネットワークなどでプロキシが必要な場合は、Proxyを設定します。
C#using System.Net;
using (var client = new WebClient())
{
client.Proxy = new WebProxy("http://proxy.example.com:8080");
string result = client.DownloadString("https://example.com");
}
認証付きプロキシの場合は、資格情報も設定します。
C#client.Proxy = new WebProxy("http://proxy.example.com:8080")
{
Credentials = new NetworkCredential("user", "password")
};
既定のプロキシを使う場合は、環境設定やWindowsのプロキシ設定も確認してください。
6. WebClientを使うときの注意点とベストプラクティス
6-1. usingまたはDisposeでリソースを解放する
WebClientは必ずusingまたはDisposeで解放します。
C#using (var client = new WebClient())
{
string result = client.DownloadString("https://example.com");
}
解放しないまま使い続けると、リソースリークや通信トラブルの原因になります。
6-2. 同じWebClientインスタンスで複数通信を同時実行しない
WebClientは同時I/O操作に対応していません。
複数の通信を並列実行したい場合は、通信ごとにインスタンスを分けるか、HttpClientを使います。
6-3. UIアプリでは同期処理によるフリーズに注意する
Windows FormsやWPFなどのUIアプリでDownloadStringやDownloadFileを同期実行すると、画面が固まることがあります。
UIアプリでは非同期処理を使い、進捗表示やキャンセル処理も実装しましょう。
新規開発では、HttpClientとasync/awaitの利用がおすすめです。
6-4. 例外処理とログ出力を必ず実装する
HTTP通信では、ネットワーク障害、タイムアウト、認証エラー、サーバーエラーなどが発生します。
最低限、次の情報をログに残すと調査しやすくなります。
URL
HTTPメソッド
ステータスコード
エラーメッセージ
レスポンス本文
実行日時
ただし、パスワードやアクセストークンなどの機密情報をログに出力してはいけません。
6-5. セキュリティ上避けるべき書き方
次のような書き方は避けましょう。
証明書検証を無効化する
APIキーやパスワードをソースコードに直書きする
ユーザー入力のURLを検証せずにアクセスする
認証トークンをログに出す
HTTPで機密情報を送信する
例外を握りつぶす
特に、SSL証明書エラーを無視するコードは危険です。テスト用途でも本番環境に残さないようにしてください。
6-6. .NET Frameworkと.NET Core/.NET 6以降での違い
.NET Frameworkでは、古い業務アプリやサンプルコードでWebClientがよく使われています。
一方、.NET Coreや.NET 6以降では、HttpClientを使うのが一般的です。
また、文字コード、TLS設定、ライブラリの挙動が環境によって異なる場合があります。古いコードを移行するときは、通信処理だけでなく例外処理や文字コード処理も確認しましょう。
7. WebClientの代替手段:HttpClientの使い方
7-1. WebClientではなくHttpClientを使うべき理由
HttpClientは、現在のC#におけるHTTP通信の標準的なクラスです。
主なメリットは次のとおりです。
async/awaitと相性がよいタイムアウト設定がしやすい
ヘッダーや認証情報を扱いやすい
ストリーム処理に向いている
テストやDIと相性がよい
拡張性が高い
新規開発では、基本的にWebClientではなくHttpClientを選びましょう。
7-2. HttpClientでGET通信を行う基本コード
HttpClientでGET通信を行う基本コードは次のとおりです。
C#using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
using var client = new HttpClient();
string html = await client.GetStringAsync("https://example.com");
Console.WriteLine(html);
}
}
awaitを使うことで、非同期通信を自然に書けます。
7-3. HttpClientでファイルをダウンロードする方法
ファイルをダウンロードして保存する例です。
C#using System.IO;
using System.Net.Http;
using System.Threading.Tasks;
using var client = new HttpClient();
byte[] data = await client.GetByteArrayAsync("https://example.com/sample.zip");
await File.WriteAllBytesAsync("sample.zip", data);
大容量ファイルの場合は、ストリームで保存する方法が適しています。
C#using System.IO;
using System.Net.Http;
using System.Threading.Tasks;
using var client = new HttpClient();
using var stream = await client.GetStreamAsync("https://example.com/sample.zip");
using var fileStream = File.Create("sample.zip");
await stream.CopyToAsync(fileStream);
7-4. HttpClientでJSONをPOSTする方法
JSONをPOSTする例です。
C#using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using var client = new HttpClient();
string json = "{\"name\":\"taro\",\"age\":30}";
using var content = new StringContent(
json,
Encoding.UTF8,
"application/json"
);
HttpResponseMessage response = await client.PostAsync(
"https://example.com/api/users",
content
);
string responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody);
ステータスコードも確認できます。
C#if (response.IsSuccessStatusCode)
{
Console.WriteLine("成功");
}
else
{
Console.WriteLine($"失敗: {(int)response.StatusCode}");
}
7-5. HttpClientでヘッダーや認証情報を設定する方法
User-Agentを設定する例です。
C#client.DefaultRequestHeaders.UserAgent.ParseAdd("MyApp/1.0");
Bearerトークンを設定する例です。
C#client.DefaultRequestHeaders.Authorization =
new System.Net.Http.Headers.AuthenticationHeaderValue(
"Bearer",
"your-access-token"
);
リクエストごとにヘッダーを変えたい場合は、HttpRequestMessageを使います。
C#using var request = new HttpRequestMessage(
HttpMethod.Get,
"https://example.com/api"
);
request.Headers.Add("X-Api-Key", "your-api-key");
HttpResponseMessage response = await client.SendAsync(request);
7-6. HttpClient利用時の注意点:使い回しとタイムアウト設定
HttpClientは、基本的に使い回す設計にします。
短時間に何度もnew HttpClient()を繰り返すと、ソケット枯渇などの問題につながることがあります。
シンプルな例では、次のように静的フィールドで持つ方法があります。
C#private static readonly HttpClient client = new HttpClient();
タイムアウトは次のように設定できます。
C#client.Timeout = TimeSpan.FromSeconds(10);
ASP.NET Coreでは、IHttpClientFactoryを使うのが一般的です。
7-7. WebClientの処理をHttpClientへ移行する例
WebClientのGET通信をHttpClientへ移行する例です。
変更前です。
C#using (var client = new WebClient())
{
string result = client.DownloadString("https://example.com");
}
変更後です。
C#using var client = new HttpClient();
string result = await client.GetStringAsync("https://example.com");
JSON POSTの移行例です。
変更前です。
C#using (var client = new WebClient())
{
client.Headers.Add("Content-Type", "application/json");
string response = client.UploadString(url, "POST", json);
}
変更後です。
C#using var client = new HttpClient();
using var content = new StringContent(
json,
Encoding.UTF8,
"application/json"
);
HttpResponseMessage response = await client.PostAsync(url, content);
string responseBody = await response.Content.ReadAsStringAsync();
8. WebClientとHttpClientの違いを比較
8-1. 機能面の違い
WebClientは簡単な通信を短いコードで書けるのがメリットです。
一方、HttpClientはより細かい制御に向いています。
| 項目 | WebClient | HttpClient |
|---|---|---|
| GET通信 | 可能 | 可能 |
| POST通信 | 可能 | 可能 |
| ファイルダウンロード | 可能 | 可能 |
| 非同期処理 | 可能だが古い形式 | async/awaitと相性がよい |
| タイムアウト設定 | やや面倒 | 簡単 |
| ヘッダー設定 | 可能 | 柔軟 |
| 拡張性 | 低め | 高い |
| 新規開発での推奨 | 非推奨寄り | 推奨 |
8-2. 非同期処理の書きやすさの違い
WebClientの非同期処理は、イベントベースです。
C#client.DownloadFileCompleted += ...;
client.DownloadFileAsync(...);
HttpClientでは、async/awaitで直感的に書けます。
C#string result = await client.GetStringAsync(url);
現代のC#では、HttpClientのほうが読みやすく保守しやすいです。
8-3. パフォーマンスと拡張性の違い
HttpClientは、継続的な通信やAPI連携、大規模アプリケーションに向いています。
特に次のようなケースでは、HttpClientが適しています。
複数のAPIを呼び出す
認証ヘッダーを管理する
リトライ処理を入れる
タイムアウトを制御する
DIで管理する
テストしやすい設計にする
WebClientは簡単な用途には便利ですが、拡張性ではHttpClientに劣ります。
8-4. エラー処理の違い
WebClientでは、HTTPエラー時にWebExceptionが発生します。
C#catch (WebException ex)
{
// ステータスコードを確認
}
HttpClientでは、レスポンスのステータスコードを確認しながら処理できます。
C#HttpResponseMessage response = await client.GetAsync(url);
if (!response.IsSuccessStatusCode)
{
Console.WriteLine(response.StatusCode);
}
HttpClientのほうが、成功・失敗を明示的に扱いやすいです。
8-5. どちらを選ぶべきか:既存保守と新規開発の判断基準
判断基準はシンプルです。
新規開発ならHttpClientを使いましょう。
既存コードでWebClientが使われており、問題なく動いている場合は、すぐに全面移行しなくてもよいケースがあります。
ただし、次のような場合は移行を検討すべきです。
.NET 6以降へ移行する
API通信が複雑になっている
タイムアウトやリトライを整理したい
非同期処理を
async/awaitに統一したいテストしやすい設計にしたい
大容量ファイルを安全に扱いたい
9. よくある質問
9-1. WebClientはまだ使えるのか?
はい、使えます。
ただし、新規開発ではHttpClientの利用が推奨されます。既存コードの保守ではWebClientが残っていても珍しくありません。
9-2. WebClientが非推奨でも既存コードは修正すべきか?
必ずしもすぐに修正する必要はありません。
小規模で安定している処理なら、そのまま保守する選択もあります。ただし、.NET 6以降への移行、API連携の拡張、非同期処理の改善を行う場合はHttpClientへの移行を検討しましょう。
9-3. DownloadFileとDownloadDataはどう使い分ける?
ファイルとして保存したい場合はDownloadFileを使います。
C#client.DownloadFile(url, path);
バイナリデータをメモリ上で扱いたい場合はDownloadDataを使います。
C#byte[] data = client.DownloadData(url);
大容量ファイルでは、メモリ消費を避けるためDownloadFileやHttpClientのストリーム処理が適しています。
9-4. WebClientでJSON APIを呼び出せる?
はい、呼び出せます。
JSONをGETする場合はDownloadString、JSONをPOSTする場合はUploadStringを使います。
C#client.Headers.Add("Content-Type", "application/json");
string response = client.UploadString(url, "POST", json);
ただし、JSON APIを本格的に扱うならHttpClientのほうが向いています。
9-5. WebClientでタイムアウトを設定できる?
標準のWebClientには直接タイムアウトを設定するプロパティがありません。
設定したい場合は、WebClientを継承してGetWebRequestをオーバーライドします。
C#public class TimeoutWebClient : WebClient
{
public int Timeout { get; set; } = 10000;
protected override WebRequest GetWebRequest(Uri address)
{
WebRequest request = base.GetWebRequest(address);
request.Timeout = Timeout;
return request;
}
}
タイムアウト制御を重視する場合は、HttpClientを使うほうが簡単です。
9-6. HttpClientへ移行するときに最初に直すべき箇所は?
まずは、DownloadString、DownloadFile、UploadStringなどの単純な通信処理から移行するのがおすすめです。
対応関係は次のとおりです。
| WebClient | HttpClient |
|---|---|
| DownloadString | GetStringAsync |
| DownloadData | GetByteArrayAsync |
| DownloadFile | GetStreamAsync+FileStream |
| UploadString | PostAsync |
| Headers | DefaultRequestHeaders |
一度にすべて移行するのではなく、影響範囲の小さい処理から段階的に進めると安全です。
まとめ
WebClientは、C#でWebページの取得、ファイルダウンロード、POST通信などを簡単に行える便利なクラスです。
DownloadStringを使えばHTMLやJSONを取得でき、DownloadFileを使えばURLからファイルを保存できます。UploadStringやUploadValuesを使えば、JSONやフォームデータのPOST通信も可能です。
一方で、現在の.NETではWebClientよりもHttpClientの利用が推奨されています。特に、新規開発、.NET 6以降のアプリ、API通信が多いシステム、大容量ファイルの処理ではHttpClientを選ぶべきです。
既存の.NET FrameworkアプリでWebClientが使われている場合は、すぐにすべてを書き換える必要はありません。ただし、タイムアウト、非同期処理、エラー処理、認証、拡張性に課題がある場合は、段階的にHttpClientへ移行するとよいでしょう。
C#でHTTP通信を実装する際は、WebClientの基本を理解したうえで、現在の開発ではHttpClientを中心に設計するのが安全です。

