You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:03:09