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

使用C# WebClient下载文件时遇“操作超时”问题求助

解决WebClient下载NSE文件超时问题

针对你用WebClient下载NSE印度交易所文件时出现的超时错误,以下是具体排查和修复方案:

1. 修复路径转义错误

你的本地路径字符串存在转义问题,\在C#中是转义字符,会导致路径解析异常,修改方式二选一:

// 使用@符号忽略转义
string path_ = @"D:\Span4\Data\NSEVAR.Dat";

// 或者用双反斜杠转义
string path_ = "D:\\Span4\\Data\\NSEVAR.Dat";

2. 优化请求头匹配服务器要求

NSE服务器对请求头验证严格,当前代码的请求头存在两个问题:

  • Accept头设置为application/pdf,但目标文件是.DAT二进制文件,服务器可能拒绝响应
  • UserAgent过于简单,被识别为非浏览器请求

修改请求头如下:

wc_.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36");
wc_.Headers.Add(HttpRequestHeader.Accept, "*/*");
// 额外添加Referer头模拟正常访问流程
wc_.Headers.Add(HttpRequestHeader.Referer, "https://www.nseindia.com/");

3. 延长WebClient超时时间

WebClient默认超时时间较短,针对NSE服务器响应速度,需自定义超时时间。由于WebClient无直接Timeout属性,通过子类重写实现:

public class WebClientWithTimeout : WebClient
{
    public int Timeout { get; set; } = 300000; // 默认5分钟

    protected override WebRequest GetWebRequest(Uri address)
    {
        var request = base.GetWebRequest(address);
        if (request != null)
        {
            request.Timeout = Timeout;
        }
        return request;
    }
}

使用该子类替代原WebClient:

using (WebClientWithTimeout wc_ = new WebClientWithTimeout())
{
    wc_.Timeout = 300000; // 5分钟超时
    wc_.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36");
    wc_.Headers.Add(HttpRequestHeader.Accept, "*/*");
    wc_.Headers.Add(HttpRequestHeader.Referer, "https://www.nseindia.com/");
    wc_.DownloadFile(file_, path_);
}

4. 推荐改用HttpClient(更稳定的替代方案)

WebClient已被标记为过时API,HttpClient提供更灵活的配置和更好的性能,适合此类场景:

// 注意:WinForms应用中需将方法标记为async
private async void DownloadNSEFile()
{
    string fileUrl = "https://nsearchives.nseindia.com/archives/nsccl/var/C_VAR1_16112023_1.DAT";
    string savePath = @"D:\Span4\Data\NSEVAR.Dat";

    using (HttpClient client = new HttpClient())
    {
        // 配置请求头
        client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36");
        client.DefaultRequestHeaders.Accept.ParseAdd("*/*");
        client.DefaultRequestHeaders.Referrer = new Uri("https://www.nseindia.com/");
        
        // 设置5分钟超时
        client.Timeout = TimeSpan.FromMinutes(5);

        try
        {
            using (HttpResponseMessage response = await client.GetAsync(fileUrl, HttpCompletionOption.ResponseHeadersRead))
            {
                response.EnsureSuccessStatusCode(); // 验证响应状态
                using (Stream contentStream = await response.Content.ReadAsStreamAsync())
                using (Stream fileStream = new FileStream(savePath, FileMode.Create, FileAccess.Write, FileShare.None))
                {
                    await contentStream.CopyToAsync(fileStream);
                }
                MessageBox.Show("文件下载成功");
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error in VAR File Download " + ex.Message);
        }
    }
}

内容的提问来源于stack exchange,提问作者Nitin Vishwakarma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 00:20:26