使用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
相关产品推荐
相关产品推荐

