0

0

C#文件下载失败恢复 C#如何处理网络中断后的文件下载重试

月夜之吻

月夜之吻

发布时间:2026-03-15 08:42:32

|

793人浏览过

|

来源于php中文网

原创

判断断点续传支持需先发HEAD请求检查Accept-Ranges: bytes及Content-Length;HttpClient需手动设Range头并以FileMode.Append写入,响应206为成功,200或416需对应处理;重试仅针对网络异常,须配合指数退避与文件校验。

c#文件下载失败恢复 c#如何处理网络中断后的文件下载重试

下载中断后如何判断是否支持断点续传

关键看服务端是否返回 Accept-Ranges: bytes 响应头,且客户端发起请求时带了 Range 头。如果服务端不支持,HttpWebRequestHttpClient 发起带 Range 的请求会直接返回 416(Requested Range Not Satisfiable)或 200 但重传整个文件——后者容易误以为“续传成功”,实则浪费流量。

实操建议:

  • 先发一个 HEAD 请求,检查响应头中是否存在 Accept-Ranges 且值为 bytes
  • 同时读取 Content-Length,确认文件总大小,用于后续校验和分块计算
  • 若服务端返回 Accept-Ranges: none 或无该头,必须放弃断点逻辑,改用完整重试 + 文件覆盖

HttpClient 实现带 Range 的续传下载

HttpClient 本身不自动处理断点,需手动构造 Range 请求头,并确保目标文件以 FileMode.Append 打开(注意:不是 FileMode.Create)。

常见错误现象:文件越下越大但内容错乱,本质是重复写入了开头部分——因为没跳过已下载字节。

实操建议:

  • FileInfo.Length 获取已存在文件大小,作为 Range 起始位置:bytes={existingLength}-
  • 创建 HttpRequestMessage,设置 Method = HttpMethod.Get,再添加 headers.Add("Range", $"bytes={existingLength}-")
  • FileStreamFileMode.AppendFileAccess.Write 打开文件,避免覆盖已有数据
  • 务必检查响应状态码:206 表示成功续传;200 表示服务端忽略 Range(需清空文件重下);416 表示已下载完成(可直接退出)

重试策略要区分网络错误与业务错误

不是所有失败都该重试。比如 404、403、401 等 HTTP 状态码,重试毫无意义;而 HttpRequestExceptionTaskCanceledException(超时)、底层 socket 中断才需要重试。

Giiso写作机器人
Giiso写作机器人

Giiso写作机器人,让写作更简单

下载

性能与体验平衡点:

  • 建议最多重试 3 次,间隔用指数退避(如 1s → 2s → 4s),避免雪崩式重连
  • 每次重试前重新检查本地文件长度和服务端 Content-Length,防止服务端文件被替换导致续传错位
  • 把重试逻辑封装进独立方法,传入当前已下载字节数、HttpClient 实例和取消令牌,便于单元测试

文件完整性校验不能省略

断点续传过程中,磁盘写入异常、缓存未刷盘、杀进程等都可能导致文件末尾损坏,仅靠长度一致无法保证正确性。

最容易被忽略的点:

  • 下载完成后,必须用服务端提供的 ETagContent-MD5 校验(如有);没有的话,至少计算本地文件的 SHA256 并与服务端 API 返回的哈希比对
  • 不要在下载中途频繁计算全量哈希——性能差;可在最后一步一次性校验
  • 校验失败时,删除不完整文件,从头开始下载(此时应记录日志,避免无限循环)

断点续传真正难的不是代码写几行,而是状态同步:本地文件长度、服务端实际内容、网络中间件(如代理、CDN)是否透传 Range、甚至杀毒软件临时锁定文件都会破坏一致性。每一步都要有 fallback 和可观测性,比如记录每次请求的 Range 值、响应状态码、写入字节数。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

184

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

226

2025.12.18

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

954

2023.09.19

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

954

2023.09.19

append用法
append用法

append是一个常用的命令行工具,用于将一个文件的内容追加到另一个文件的末尾。想了解更多append用法相关内容,可以阅读本专题下面的文章。

349

2023.10.25

python中append的用法
python中append的用法

在Python中,append()是列表对象的一个方法,用于向列表末尾添加一个元素。想了解更多append的更多内容,可以阅读本专题下面的文章。

1080

2023.11.14

python中append的含义
python中append的含义

本专题整合了python中append的相关内容,阅读专题下面的文章了解更多详细内容。

186

2025.09.12

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

498

2023.11.09

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.4万人学习

C 教程
C 教程

共75课时 | 5.5万人学习

C++教程
C++教程

共115课时 | 22万人学习

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

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