在C#网络编程中,WebClient和HttpClient都可以用来发送HTTP请求,但它们在异常处理的设计上有明显区别。WebClient出现于早期.NET版本,而HttpClient是后来推出的更现代的API,两者的错误暴露方式直接影响我们写捕获逻辑。

WebClient的异常处理方式
WebClient在请求失败时会抛出WebException异常。我们可以通过异常对象的Status属性来判断失败类型,例如连接失败、超时或者服务端返回了错误状态码。
using System;
using System.Net;
class Program
{
static void Main()
{
using (var client = new WebClient())
{
try
{
string result = client.DownloadString("https://ipipp.com/test");
Console.WriteLine(result);
}
catch (WebException ex)
{
// 通过Status判断具体错误类型
if (ex.Status == WebExceptionStatus.Timeout)
{
Console.WriteLine("请求超时");
}
else if (ex.Response is HttpWebResponse response)
{
Console.WriteLine("状态码:" + (int)response.StatusCode);
}
else
{
Console.WriteLine("其他网络错误:" + ex.Message);
}
}
}
}
}
HttpClient的异常处理方式
HttpClient采用基于Task的异步模型,请求失败通常会抛出HttpRequestException。这类异常不会直接告诉我们HTTP状态码,需要检查内部异常或者改用EnsureSuccessStatusCode来触发错误。
using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
using (var client = new HttpClient())
{
try
{
// 如果状态码不是2xx,EnsureSuccessStatusCode会抛异常
var response = await client.GetAsync("https://ipipp.com/test");
response.EnsureSuccessStatusCode();
string content = await response.Content.ReadAsStringAsync();
Console.WriteLine(content);
}
catch (HttpRequestException ex)
{
// HttpClient把状态码错误也包成HttpRequestException
Console.WriteLine("请求出错:" + ex.Message);
}
}
}
}
两者的主要差异对比
| 对比项 | WebClient | HttpClient |
|---|---|---|
| 异常类型 | WebException | HttpRequestException |
| 状态码获取 | 通过WebException.Response | 通过HttpResponseMessage.StatusCode |
| 编程模型 | 同步为主 | 异步Task模型 |
| 细化错误 | WebExceptionStatus枚举 | 需看内部异常或响应对象 |
实际使用建议
如果是维护老项目,WebClient的WebException还算直观,但注意它已被标记为过时。新项目应优先使用HttpClient,并在异步方法中用try-catch包裹,配合response.StatusCode做精细处理。
- WebClient适合简单同步脚本,异常判断集中。
- HttpClient适合高并发服务,异常需结合响应对象分析。
- 不要每次请求都new HttpClient,应使用单例或静态实例。
总结来说,WebClient把错误包装成WebException方便按状态分类,HttpClient则用HttpRequestException加响应对象来表达,理解这一点能减少排查线上问题的成本。
C#WebClientHttpClient修改时间:2026-07-27 14:12:19