0

0

c# 如何实现断点续传

畫卷琴夢

畫卷琴夢

发布时间:2026-01-16 13:19:02

|

613人浏览过

|

来源于php中文网

原创

断点续传的核心机制是客户端通过HTTP Range请求头告知服务端起始字节,服务端返回206 Partial Content响应,客户端按偏移量将数据写入本地文件对应位置;C#中需用HttpClient手动设置Range头、校验状态码、定位文件流写入,不可用DownloadFileAsync。

c# 如何实现断点续传

什么是断点续传的核心机制

断点续传不是某个现成 API,而是靠 HTTP 协议的 Range 请求头 + 服务端支持 + 客户端本地文件偏移写入协同实现的。关键在于:客户端要能告诉服务端“我要从第 N 字节开始下载”,服务端得返回 206 Partial Content,客户端再把响应体追加写入到本地文件对应位置。

C# 中用 HttpClient 发起带 Range 的请求

必须手动设置 Range 头,并检查响应状态码是否为 206;不能用 DownloadFileAsync 这类封装方法,它不支持断点控制。

  • HttpClient 实例建议复用(避免 socket 耗尽),且需启用 AllowAutoRedirect = false,防止重定向丢失 Range
  • 请求前用 FileInfo.Length 获取已下载字节数,作为 Range: bytes={length}-
  • 响应中通过 response.Content.Headers.ContentRange 解析实际返回的字节范围,验证是否匹配预期
var client = new HttpClient { AllowAutoRedirect = false };
var req = new HttpRequestMessage(HttpMethod.Get, "https://example.com/large.zip");
req.Headers.Range = new System.Net.Http.Headers.RangeHeaderValue(localFileLength, null);

var res = await client.SendAsync(req); if (res.StatusCode != HttpStatusCode.PartialContent) { throw new InvalidOperationException($"Expected 206, got {res.StatusCode}"); }

如何安全地追加写入已存在文件

直接 FileMode.Append 不行——它会在文件末尾写入,但服务端返回的可能是中间某段(比如断点在 10MB,服务端返回的是 10MB–15MB),必须按字节偏移写入。

HeyGen
HeyGen

HeyGen是一个AI虚拟数字人生成平台,可以根据用户提供的内容,快速生成高质量的虚拟发言人视频,支持数字化身、文本转视频和视频翻译。

下载
  • 打开文件用 FileMode.Open + FileAccess.Write
  • 调用 stream.Seek(offset, SeekOrigin.Begin) 定位到指定位置
  • stream.Write(buffer, 0, read) 写入,而非 WriteAsync(避免因异步调度导致 seek 位置错乱)
  • 务必用 usingtry/finally 确保流关闭,否则下次打开会报“文件正由另一进程使用”

服务端不支持 Range 时怎么降级处理

遇到 416 Range Not Satisfiable 或直接返回 200(非 206),说明服务端不支持断点续传。此时有两种选择:

  • 清空本地文件,重新下载(最简单,但浪费已下载数据)
  • 先 HEAD 请求获取 Content-Length,对比本地文件大小;若一致则跳过下载,不一致才全量重下
  • 注意:某些 CDN 或反向代理会吞掉 Range 头并返回完整响应,此时 Content-Range 响应头为空,需主动检查

真正麻烦的是中间网络中断后文件损坏却长度恰好匹配——这需要额外做校验(如服务端提供 ETag 或分块哈希),单纯靠长度无法保证一致性。

相关专题

更多
length函数用法
length函数用法

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

918

2023.09.19

append用法
append用法

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

343

2023.10.25

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

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

1071

2023.11.14

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

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

174

2025.09.12

http500解决方法
http500解决方法

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

344

2023.11.09

http请求415错误怎么解决
http请求415错误怎么解决

解决方法:1、检查请求头中的Content-Type;2、检查请求体中的数据格式;3、使用适当的编码格式;4、使用适当的请求方法;5、检查服务器端的支持情况。更多http请求415错误怎么解决的相关内容,可以阅读下面的文章。

407

2023.11.14

HTTP 503错误解决方法
HTTP 503错误解决方法

HTTP 503错误表示服务器暂时无法处理请求。想了解更多http错误代码的相关内容,可以阅读本专题下面的文章。

1754

2024.03.12

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1973

2024.08.16

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

3

2026.01.16

热门下载

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

精品课程

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

共32课时 | 3.8万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

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

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