使用WebClient DownloadString获取网页返回400 Bad Request错误如何解决
问题原因及解决方案
1. 核心错误原因
你在GET请求中添加了Content-Type: application/json;charset=UTF-8请求头,这个头仅用于POST/PUT等携带请求体的请求,用来告知服务器请求体的内容格式。GET请求本身没有请求体,添加这个头会触发服务端参数校验失败,直接返回400错误,直接删除该头即可解决问题。
2. URL中#符号无需转义
#及后续内容属于浏览器端哈希路由,仅用于前端页面路由跳转,不会被发送到服务端,服务端实际接收的请求地址为https://saleslink.aa.com/en-US/,不需要做额外转义处理。
注意:该站点是单页应用,页面核心内容由前端动态渲染,直接请求拿到的初始HTML中不会包含渲染完成的业务数据,如果后续解析不到目标内容,需要改用Puppeteer Sharp等无头浏览器工具渲染页面后再提取内容。
3. 修复后的可用代码示例
基于WebClient的修复版本
using (WebClient client = new WebClient()) { client.Headers.Add("Accept-Language", "en-US"); client.Headers.Add("Accept", "text/html, application/xhtml+xml, */*"); // 替换为新版浏览器UA,避免服务端拦截旧版本IE标识 client.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"); string html = client.DownloadString("https://saleslink.aa.com/en-US/"); }
基于HtmlAgilityPack的修复版本
HtmlWeb web = new HtmlWeb(); web.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"; HtmlDocument doc = web.Load("https://saleslink.aa.com/en-US/");
更推荐的HttpClient实现(WebClient已被官方标记为过时)
// HttpClient建议全局单例初始化,不要每次请求都释放 private static readonly HttpClient _httpClient = new HttpClient(); // 请求逻辑 _httpClient.DefaultRequestHeaders.AcceptLanguage.ParseAdd("en-US"); _httpClient.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"); string html = await _httpClient.GetStringAsync("https://saleslink.aa.com/en-US/"); // 后续用HtmlAgilityPack解析 HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(html);
内容的提问来源于stack exchange,提问作者Saurabh
相关产品推荐
相关产品推荐

