当前位置: 首页 > news >正文

C# 基于HttpClient支持续传的网络下载

现在网上很多的网络下载使用的都是 WebResponse,使用的时候微软也会告诉我们这玩意已经过时了,推荐我们使用 HttpClient,但是网上少有这个库的轮子,所以现在我们来造一个:

本文仅仅介绍核心用法,以及部分业务,具体业务可以自行添加

var httpClient= new HttpClient();// 如果是续传,获取已经下载了多少
var downloadProgress= new FileInfo(文件存放地址).Length;

tips:这里获得已经下载文件的大小,为后面的续传做准备

var request = new HttpRequestMessage(HttpMethod.Get, 下载的URL链接);//从指定位置开始下载文件,这样子可以实现断点续传
request.Headers.Range = new RangeHeaderValue(downloadProgress, null);

这样子就可以实现从指定大小位置去下载,完成断点续传。

using (var response = await client.SendAsync(request))
{//检查请求是否成功,官方语法糖封装response.EnsureSuccessStatusCode();//这个是总下载量,也就是URL的东西一共有多大var totalLength = response.Content.Headers.ContentRange.Length;using var stream = await response.Content.ReadAsStreamAsync();//启用文件追加模式,确保之前下载一半的文件还能被续上using var fileStream = new FileStream(文件存放地址, FileMode.Append,FileAccess.Write);//传输层的优化buffer大小一般在4KB左右,选择4KB可以与传输层匹配,减少copying数据的次数,提高效率var buffer = new byte[4096];int read;//缓存已下载的字节数量,到达一个阈值再通知界面变更,根据业务随便变更var temp = 0;//每次读取一个buffer的量,处理逻辑,写入文件while ((read = await stream.ReadAsync(buffer)) > 0){//外部传入的CancellationToken,用于随时取消下载任务XXX.CancellationToken.ThrowIfCancellationRequested();//将字节数追加写入文件await fileStream.WriteAsync(buffer.AsMemory(0, read));downloaded += read;temp += read;//这里以例子以百分之一进度为阈值更新界面,也可以全部通知出去,不沾染业务if (temp > totalLength / 100){//这里触发需要触发的回调函数回调((double)((double)downloadProgress/ totalLength) * 100);temp = 0;}}
}

部分地方填入自己的代码,可以实现取消,暂停,续传等功能

由于该方法需要外界传入的参数比较多,>=5个(lindexi推荐参数(•̀ᴗ•́)و),所以建议封装成一个类 ,下面给出Demo仅供参考

public class DownloadModel
{/// <summary>/// 需要下载的URL路径/// </summary>public string Url { get; set; }/// <summary>/// 文件下载后保存的路径/// </summary>public string LocalSaveFullPath { get; set; }/// <summary>/// 是否是续点下载/// </summary>public bool Iscontinue { get; set; }/// <summary>/// 进度条回报方法/// </summary>public Action<double> ProgressRollBack { get; set; }/// <summary>/// 取消/// </summary>public CancellationToken CancellationToken { get; set; }
}

这样一个基于HttpClient支持续传的网络下载就OK了

http://www.jsqmd.com/news/1365434/

相关文章:

  • 基于LLM的提示词自优化:从原理到Python实战
  • 数字展陈技术解析:博物馆数字化与多模态交互实践
  • 从零集成Ling 3.0 Flash:开源大模型本地部署与API调用实战
  • JMeter接口测试实战指南:从环境搭建到结果分析的完整流程
  • 华为eNSP网络模拟器入门与基础实验指南
  • 终极Windows iOS模拟器指南:5分钟免费运行iPhone应用
  • Noto Emoji开源字体:CBDT与COLRv1格式深度对比与选型指南
  • 金仓数据库生产环境高可用部署与智能运维实战经验分享
  • 上市公司支付宝渗透度数据(2013-2024)
  • 5分钟掌握AMD锐龙处理器调校:SMUDebugTool终极指南
  • Linux磁盘空间管理:du命令详解与实战技巧
  • 从Zig到Rust:Bun运行时百万行重写的架构决策、AI工程实践与开源治理之争
  • 二叉树路径总和III问题解析与优化
  • Matlab哼唱识别系统开发与优化实践
  • 2026天津春考集训选校全指南 机构测评与备考攻略汇总 - 贰拾壹度
  • 职场英语学习计划Day036
  • 免费开源游戏串流服务器Sunshine:把旧电脑变成你的游戏主机
  • Word中文句号输入异常排查与解决方案
  • Palantir 给中国企业上了一课:AI 落地缺的不是模型,是“操作系统“
  • Claude Code订阅迷雾与HumanLayer项目:AI编程助手的安全架构实践
  • UE4中实现网页透明与事件穿透:WebUI插件深度集成指南
  • LiteRT.js:浏览器端AI推理的性能革命与TensorFlow.js协作解析
  • 关于Playwright定位问题:完整的定位心法
  • Codex本地部署与API集成指南:一站式AI模型服务编排平台实践
  • 2026 年北京云梯车租赁 路灯车租赁常见问题解答 - LYL仔仔
  • 2026 年重庆永川衣柜定制墙板批发全屋定制建材门店 - LYL仔仔
  • Claude AI接入配置与Fable 5安全机制优化全指南
  • 斐讯T1盒子Armbian系统终极改造指南:从电视盒子到全能服务器
  • GPT-5.6 Luna降价背后:大模型API成本控制与Token管理实战指南
  • AI应用工程化实战:从模型调用到高易用性服务封装