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),必须按字节偏移写入。

羚珑
羚珑

京东推出的一站式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的更多内容,可以阅读本专题下面的文章。

1072

2023.11.14

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

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

175

2025.09.12

http500解决方法
http500解决方法

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

347

2023.11.09

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

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

408

2023.11.14

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

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

1781

2024.03.12

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

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

1976

2024.08.16

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

9

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号