0

0

C#文件下载实现 C#如何从服务器下载文件

畫卷琴夢

畫卷琴夢

发布时间:2026-02-05 11:19:54

|

740人浏览过

|

来源于php中文网

原创

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

c#文件下载实现 c#如何从服务器下载文件

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 兼容场景)。

DM6在线读报系统
DM6在线读报系统

DM6在线读报系统ASPX 免费版2.0。如果您是一个DM广告公司的网站管理员,正在寻求一套程序或源码可以让公司网站具有一套配合网站整体架构的电子杂志频道,那您现在可找对了。请仔细阅读以下关于DM6在线读报系统的说明。 这是一个网站用户可以直接在线阅读报纸且无需插件(连Flash都不用)、无需下载、无需安装的在线读报系统(服务器端模块),通过将此系统放到网站文件目录中即可轻松生成网站的在线读报频道

下载

处理重定向和认证:别漏掉 AllowAutoRedirectDefaultRequestHeaders

很多下载失败不是因为代码逻辑,而是服务器返回 302 或要求 Bearer Token。默认 HttpClient 会自动跟随重定向,但某些私有 API 可能禁用此行为。

  • 如需手动控制跳转,设 client.DefaultRequestHeaders.Referrer 或检查 response.RequestMessage.RequestUri 是否变化
  • 带 Token 的请求:加 client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token)
  • 需要 Cookie 或表单登录态?必须复用同一个 HttpClient 实例,并启用 CookieContainer(需搭配 HttpHandler 构造)

没设认证头却去请求受保护资源,大概率收到 401;忽略重定向则可能卡在中间页返回 HTML 而非文件流。

大文件或弱网下容易出错:必须加取消令牌和异常分类处理

用户点“取消下载”、网络中断、磁盘满——这些都会抛不同异常,不能全 catch 住吞掉。

  • 所有 await 调用都要传 cancellationToken,并在 UI 层绑定按钮的取消逻辑
  • OperationCanceledException 表示主动取消,不是错误,别记日志
  • HttpRequestException 包含网络层问题(DNS 失败、连接被拒),可重试 1–2 次
  • IOException 如磁盘空间不足,应提示用户清理而非重试

最容易被忽略的是:下载中途断电或进程被杀,会导致文件不完整却没报错。建议下载完成后用 response.Content.Headers.ContentMD5 校验(如果服务器提供了),或至少检查最终文件大小是否匹配 ContentLength

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

238

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

560

2024.03.01

cookie
cookie

Cookie 是一种在用户计算机上存储小型文本文件的技术,用于在用户与网站进行交互时收集和存储有关用户的信息。当用户访问一个网站时,网站会将一个包含特定信息的 Cookie 文件发送到用户的浏览器,浏览器会将该 Cookie 存储在用户的计算机上。之后,当用户再次访问该网站时,浏览器会向服务器发送 Cookie,服务器可以根据 Cookie 中的信息来识别用户、跟踪用户行为等。

6435

2023.06.30

document.cookie获取不到怎么解决
document.cookie获取不到怎么解决

document.cookie获取不到的解决办法:1、浏览器的隐私设置;2、Same-origin policy;3、HTTPOnly Cookie;4、JavaScript代码错误;5、Cookie不存在或过期等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

352

2023.11.23

阻止所有cookie什么意思
阻止所有cookie什么意思

阻止所有cookie意味着在浏览器中禁止接受和存储网站发送的cookie。阻止所有cookie可能会影响许多网站的使用体验,因为许多网站使用cookie来提供个性化服务、存储用户信息或跟踪用户行为。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

415

2024.02.23

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

95

2025.08.19

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6295

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

825

2023.09.14

AO3官网入口与镜像站汇总 Archive of Our Own访问路径及最新入口
AO3官网入口与镜像站汇总 Archive of Our Own访问路径及最新入口

本专题专注于提供Archive of Our Own (AO3) 的最新官网入口与镜像站地址,详细整理了可用的访问路径,包括中文镜像站入口和网页版直达链接,帮助用户轻松找到最稳定的访问方式,确保顺畅浏览AO3内容。

1

2026.02.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.2万人学习

AngularJS教程
AngularJS教程

共24课时 | 3.3万人学习

CSS教程
CSS教程

共754课时 | 27.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号