推荐使用 HttpClient 而非 WebClient,因前者支持异步优先、连接复用、HTTP/2/3、统一消息模型及 IHttpClientFactory 管理,后者已过时且功能受限、易致资源泄漏。

HttpClient 是当前 .NET 中推荐的 HTTP 客户端,WebClient 已被标记为“过时(obsolete)”且不再更新。如果你用的是 .NET Core 2.1+ 或 .NET 5/6/7/8,直接选 HttpClient;只有在维护非常老的 .NET Framework 3.5–4.5 项目且无法升级时,才可能还在用 WebClient。
功能覆盖:HttpClient 更完整、更现代
HttpClient 支持异步优先、管道复用、自定义消息处理器(如日志、重试、认证)、跨平台(Windows/macOS/Linux)、HTTP/2 和 HTTP/3(.NET 5+),还能配合 Polly 做弹性策略。WebClient 只提供简单封装(如 DownloadStringAsync),底层仍基于 HttpWebRequest,不支持连接池复用,也没有统一的请求/响应模型。
- HttpClient 使用
HttpRequestMessage和HttpResponseMessage,结构清晰,便于测试和扩展 - WebClient 的方法命名(如
UploadValues)隐含行为,参数类型不直观,出错时调试困难 - HttpClient 允许设置默认请求头、超时、取消令牌,WebClient 的配置分散且粒度粗
线程与资源管理:HttpClient 要正确复用,WebClient 容易误用
HttpClient 设计为长期存活、静态或单例复用(不是每次请求 new 一个),否则会引发端口耗尽。WebClient 虽然每次 new 不会立刻崩溃,但内部仍创建新连接,频繁使用也会导致 socket 耗尽或 DNS 缓存问题。
- 推荐写法:
static readonly HttpClient client = new HttpClient();或通过 DI 注册为 Singleton - WebClient 没有内置生命周期管理,
Dispose()必须显式调用,否则可能泄漏连接 - HttpClient 支持
IHttpClientFactory(.NET Core+),自动处理 DNS 刷新、错误恢复和连接池
兼容性与迁移成本:升级不难,收益明显
把 WebClient 改成 HttpClient 通常只需几行代码替换,比如 webClient.DownloadString(url) → client.GetStringAsync(url)。多数场景下,返回值类型从 string 变成 Task
- POST 表单数据:WebClient 用
UploadValues,HttpClient 用new FormUrlEncodedContent(dict) - 上传文件:WebClient 用
UploadFile,HttpClient 用MultipartFormDataContent - 需要同步阻塞?别这么做——HttpClient 不提供同步 API,这是有意为之,避免死锁
基本上就这些。HttpClient 不是“更高级的替代”,而是面向现代网络应用的重新设计。WebClient 留在历史里挺好,新代码就别再用了。










