讲师中心 微信公众号
AI工具推荐 视频效率加速

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

夏强姑娘_3880

夏强姑娘_3880

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

|

780人浏览过

|

来源于php中文网

原创

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

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

用 HttpClient 下载文件最稳妥

直接用 WebClient 虽然简单,但已标记为过时(.NET Core 5+ 开始不推荐),HttpClient 是现代首选。它支持异步、可复用、能控制超时和请求头,还天然适配 Progress<int></int> 实时反馈进度。

关键点:

  • 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<int></int> 才行

HttpClient 本身不提供下载进度回调,得手动分块读取并报告。常见错误是试图在 CopyToAsync 里塞回调——它不支持。

正确做法是用循环 + streamToReadFrom.ReadAsync 读固定大小缓冲区,每读一块就调用 progress.Report():

Convert Markdown To HTML And PDF - Markdown和HTML、PDF互转
Convert Markdown To HTML And PDF - Markdown和HTML、PDF互转

实现 Markdown↔ HTML 互转,支持导出 PDF,用于用户请求的文档格式转换。

下载
  • 缓冲区大小建议设为 8192 或 65536,太小影响性能,太大占内存
  • 注意最后一批数据可能不足缓冲区长度,别直接用 buffer.Length 当实际字节数
  • 进度百分比要基于 response.Content.Headers.ContentLength 计算,但该值可能为 null(服务器未返回 Content-Length)

若 ContentLength 缺失,只能用“已下载字节数”做相对进度,或改用 WebClient.DownloadFileAsync(仅限 .NET Framework 兼容场景)。

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

很多下载失败不是因为代码逻辑,而是服务器返回 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工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

相关专题

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

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

549

2023.09.22

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

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

1698

2024.03.01

cookie
cookie

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

12699

2023.06.30

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

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

1306

2023.11.23

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

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

864

2024.02.23

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

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

1966

2025.08.19

登录token无效
登录token无效

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

15066

2023.09.14

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

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

1765

2023.09.14

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

0

2026.11.06

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
GDB 17.2 官方文档集合
GDB 17.2 官方文档集合

共0课时 | 0人学习

Bootstrap 入门安装配置
Bootstrap 入门安装配置

共0课时 | 0人学习

38+ PhpStorm 提示和技巧
38+ PhpStorm 提示和技巧

共1课时 | 237人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn