使用C# WebClient下载文件时遇10054错误,求解决方案
解决WebClient下载文件抛出“An existing connection was closed by the remote host (10054)”的问题
这个10054错误我之前也碰到过,大概率是目标网站的反爬策略或者连接校验规则更新了,只加User-Agent确实可能不够,给你几个实用的解决方案:
补全更多浏览器请求头:很多网站会同时检查多个请求头来判断是否是浏览器访问,比如
Accept、Accept-Language、Referer这些,你可以直接照搬浏览器正常请求时的头信息。示例代码:using (var client = new WebClient()) { // 模拟Chrome浏览器的请求头 client.Headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"; client.Headers["Accept"] = "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8"; client.Headers["Accept-Language"] = "en-US,en;q=0.5"; client.Headers["Referer"] = "http://www.cftc.gov/"; // 设为目标网站的主页,模拟从站内跳转过来的请求 client.DownloadFile(@"http://www.cftc.gov/files/dea/history/com_disagg_txt_2018.zip", @"destination"); }切换到HttpClient替代WebClient:WebClient是比较老旧的API,HttpClient在处理现代HTTP请求时更灵活稳定,还支持连接池、自动重试等特性,兼容性更好。示例代码(异步版本,同步也可以调整):
using (var httpClient = new HttpClient()) { // 添加请求头 httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"); httpClient.DefaultRequestHeaders.Accept.ParseAdd("text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8"); // 发起请求并确保成功 var response = await httpClient.GetAsync(@"http://www.cftc.gov/files/dea/history/com_disagg_txt_2018.zip"); response.EnsureSuccessStatusCode(); // 写入文件 using (var fileStream = new FileStream(@"destination", FileMode.Create, FileAccess.Write)) { await response.Content.CopyToAsync(fileStream); } }尝试切换到HTTPS协议:有些网站会逐步强制HTTPS访问,原HTTP地址可能会触发重定向,而WebClient的重定向处理可能不符合服务器预期。你可以把URL改成
https://www.cftc.gov/files/dea/history/com_disagg_txt_2018.zip再试试。添加重试机制:偶尔的连接关闭可能是网络波动导致的,你可以给请求加上简单的重试逻辑,避免单次失败就终止:
int maxRetries = 3; bool downloadSuccess = false; while (maxRetries > 0 && !downloadSuccess) { try { using (var client = new WebClient()) { client.Headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"; client.DownloadFile(@"http://www.cftc.gov/files/dea/history/com_disagg_txt_2018.zip", @"destination"); } downloadSuccess = true; } catch (WebException) { maxRetries--; System.Threading.Thread.Sleep(1000); // 间隔1秒后重试 if (maxRetries == 0) throw; // 重试耗尽后抛出原异常 } }检查请求频率限制:如果你的程序是高频请求,服务器可能会临时封禁你的IP。可以尝试降低请求频率,或者在每次请求之间添加适当的延迟。
另外,你可以用浏览器的开发者工具(按F12打开,切换到Network标签),正常下载文件时查看对应的请求头,完全照搬这些头信息,模拟浏览器的程度越高,越容易通过服务器的校验。
内容的提问来源于stack exchange,提问作者TC2
相关产品推荐
相关产品推荐

