如何在C#中从重定向URL下载CSV文件?WebClient返回HTML内容
解决WebClient下载TSMC会员区CSV时重定向返回HTML的问题
这个问题的核心原因是目标链接属于会员专属资源,服务器需要验证会话有效性。WebClient默认的重定向处理无法正确传递必要的认证Cookie或请求头,导致服务器返回登录页面HTML而非预期的CSV文件。以下是可行的解决方案:
改用HttpClient处理请求(推荐)
HttpClient对Cookie、请求头的控制更灵活,能更好地模拟浏览器请求行为:
步骤1:准备有效会话Cookie
登录members.tsetmc.com后,在浏览器开发者工具的Application > Cookies中复制认证相关的Cookie(比如ASP.NET_SessionId或其他站点专属认证Cookie)。
步骤2:编写下载代码
using System.Net; using System.Net.Http; using System.IO; public async Task DownloadTargetCsvAsync() { var cookieContainer = new CookieContainer(); using var handler = new HttpClientHandler { CookieContainer = cookieContainer, AllowAutoRedirect = true // 自动处理重定向 }; using var client = new HttpClient(handler); // 添加从浏览器获取的有效会话Cookie cookieContainer.Add( new Uri("https://members.tsetmc.com"), new Cookie("ASP.NET_SessionId", "替换为你的会话ID值") ); // 若有其他认证Cookie,重复上述Add方法添加 // 模拟浏览器请求头 client.DefaultRequestHeaders.UserAgent.ParseAdd( "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" ); client.DefaultRequestHeaders.Accept.ParseAdd("text/csv,application/vnd.ms-excel"); var targetUrl = "https://members.tsetmc.com/tsev2/chart/data/Financial.aspx?i=57086055330734195&t=ph&a=1"; var response = await client.GetAsync(targetUrl); // 确保请求成功 response.EnsureSuccessStatusCode(); // 保存CSV到指定路径 var csvContent = await response.Content.ReadAsByteArrayAsync(); File.WriteAllBytes(@"C:\你的指定路径\financial_data.csv", csvContent); }
若必须使用WebClient的兼容方案
如果坚持使用WebClient,需要手动注入Cookie和请求头:
using System.Net; public void DownloadWithWebClient() { using var client = new WebClient(); // 添加Cookie client.Headers.Add(HttpRequestHeader.Cookie, "ASP.NET_SessionId=你的会话ID值; 其他认证Cookie=对应值"); // 添加请求头 client.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"); client.Headers.Add(HttpRequestHeader.Accept, "text/csv,application/vnd.ms-excel"); var targetUrl = "https://members.tsetmc.com/tsev2/chart/data/Financial.aspx?i=57086055330734195&t=ph&a=1"; client.DownloadFile(targetUrl, @"C:\你的指定路径\financial_data.csv"); }
关键注意事项
- Cookie必须是当前有效的会话值,过期后需要重新从浏览器获取。
- 若未登录,需先模拟登录:向站点的登录接口发送POST请求,传递用户名密码,获取会话Cookie后再执行下载操作。
- 服务器可能会验证请求头的合法性,务必模拟真实浏览器的请求头信息。
内容的提问来源于stack exchange,提问作者user3790106
相关产品推荐
相关产品推荐

