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#では、HttpClientasync/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ステータスコードを確認するには、ResponseHttpWebResponseにキャストします。

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アプリでDownloadStringDownloadFileを同期実行すると、画面が固まることがあります。

UIアプリでは非同期処理を使い、進捗表示やキャンセル処理も実装しましょう。

新規開発では、HttpClientasync/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はより細かい制御に向いています。

項目WebClientHttpClient
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);

大容量ファイルでは、メモリ消費を避けるためDownloadFileHttpClientのストリーム処理が適しています。

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へ移行するときに最初に直すべき箇所は?

まずは、DownloadStringDownloadFileUploadStringなどの単純な通信処理から移行するのがおすすめです。

対応関係は次のとおりです。

WebClientHttpClient
DownloadStringGetStringAsync
DownloadDataGetByteArrayAsync
DownloadFileGetStreamAsync+FileStream
UploadStringPostAsync
HeadersDefaultRequestHeaders

一度にすべて移行するのではなく、影響範囲の小さい処理から段階的に進めると安全です。

まとめ

WebClientは、C#でWebページの取得、ファイルダウンロード、POST通信などを簡単に行える便利なクラスです。

DownloadStringを使えばHTMLやJSONを取得でき、DownloadFileを使えばURLからファイルを保存できます。UploadStringUploadValuesを使えば、JSONやフォームデータのPOST通信も可能です。

一方で、現在の.NETではWebClientよりもHttpClientの利用が推奨されています。特に、新規開発、.NET 6以降のアプリ、API通信が多いシステム、大容量ファイルの処理ではHttpClientを選ぶべきです。

既存の.NET FrameworkアプリでWebClientが使われている場合は、すぐにすべてを書き換える必要はありません。ただし、タイムアウト、非同期処理、エラー処理、認証、拡張性に課題がある場合は、段階的にHttpClientへ移行するとよいでしょう。

C#でHTTP通信を実装する際は、WebClientの基本を理解したうえで、現在の開発ではHttpClientを中心に設計するのが安全です。