C#文件下载实现 C#如何从服务器下载文件-C#.Net教程

HttpClient是下载文件的现代首选,需单例复用、设置超时、用ResponseHeadersRead避免内存溢出、分块读写并支持IProgress进度报告,同时处理重定向、认证、异常和完整性校验。

用 HttpClient 下载文件最稳妥

直接用 WebClient 虽然简单,但已标记为过时(.NET Core 5+ 开始不推荐),HttpClient 是现代首选。它支持异步、可复用、能控制超时和请求头,还天然适配 Progress 实时反馈进度。

关键点:

  • HttpClient 应作为单例或静态实例重用,不要每次下载都 new 一个
  • 务必用 await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead),避免把整个响应体提前读进内存
  • 用 response.Content.ReadAsStreamAsync() 获取流后,再配合 FileStream 分块写入磁盘
  • 记得设置 client.Timeout,否则大文件可能卡死无响应

示例片段:

var client = new HttpClient();
client.Timeout = TimeSpan.FromMinutes(10);
using var response = await client.GetAsync("https://example.com/file.zip", HttpCompletionOption.ResponseHeadersRead);
response.EnsureSuccessStatusCode();
using var streamToReadFrom = await response.Content.ReadAsStreamAsync();
using var streamToWriteTo = File.Create(@"C:\temp\file.zip");
await streamToReadFrom.CopyToAsync(streamToWriteTo);

需要显示进度?绑定 IProgress 才行

HttpClient 本身不提供下载进度回调,得手动分块读取并报告。常见错误是试图在 CopyToAsync 里塞回调——它不支持。

正确做法是用循环 + streamToReadFrom.ReadAsync 读固定大小缓冲区,每读一块就调用 progress.Report():

  • 缓冲区大小建议设为 8192 或 65536,太小影响性能,太大占内存
  • 注意最后一批数据可能不足缓冲区长度,别直接用 buffer.Length 当实际字节数
  • 进度百分比要基于 response.Content.Headers.ContentLength 计算,但该值可能为 null(服务器未返回 Content-Length)

若 ContentLength 缺失,只能用“已下载字节数”做相对进度,或改用 WebClient.DownloadFileAsync(仅限 .NET Framework 兼容场景)。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » C#文件下载实现 C#如何从服务器下载文件-C#.Net教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4000194+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4000194+
  • 本周更新: 0+
  • 最后更新: 2026-03-16