C#使用AngleSharp发GET请求返回406 Not Acceptable错误如何解决
问题原因
- 核心原因1:
BrowsingContext.OpenAsync()是专为加载HTML网页设计的API,发送请求时AngleSharp会自动覆盖你手动设置的Accept头,替换为text/html,application/xhtml+xml,application/xml这类网页优先的内容类型,你设置的*/*实际并未生效,而目标API仅返回application/json类型响应,匹配失败就返回406错误。 - 原因2:你复制的是浏览器加载普通网页的请求头,和API接口的实际请求头不匹配:API接口的
Sec-Fetch-Dest应为empty、Sec-Fetch-Mode应为cors,你设置的document、navigate是网页加载的参数,不符合API的校验规则。 - 原因3:缺失目标站点必填的
Referer请求头,该站点API要求请求必须携带对应房源页面的Referer,作为反爬校验规则的一部分,缺失也会触发406错误。
解决方案
建议直接用HttpClient发送API请求,避免AngleSharp的自动头修改逻辑,修改后的代码参考如下:
// 建议HttpClient全局单例,不要每次请求新建 var client = new HttpClient(); // 添加所有符合API要求的请求头 client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0"); client.DefaultRequestHeaders.Accept.ParseAdd("application/json, */*;q=0.8"); client.DefaultRequestHeaders.AcceptEncoding.ParseAdd("gzip, deflate, br"); client.DefaultRequestHeaders.AcceptLanguage.ParseAdd("de,en-US;q=0.7,en;q=0.3"); client.DefaultRequestHeaders.Connection.ParseAdd("keep-alive"); // Referer替换为对应房源的实际详情页地址 client.DefaultRequestHeaders.Referrer = new Uri("https://www.wg-gesucht.de/wohnungen-in-Muenchen.6839242.html"); client.DefaultRequestHeaders.Add("Sec-Fetch-Dest", "empty"); client.DefaultRequestHeaders.Add("Sec-Fetch-Mode", "cors"); client.DefaultRequestHeaders.Add("Sec-Fetch-Site", "same-origin"); client.DefaultRequestHeaders.Add("X-Requested-With", "XMLHttpRequest"); // 发送请求获取JSON数据 var response = await client.GetAsync("https://www.wg-gesucht.de/api/profiles/contact-data/5520144?asset_type=0&asset_id=6839242"); response.EnsureSuccessStatusCode(); var jsonResult = await response.Content.ReadAsStringAsync();
如果你必须使用AngleSharp的请求体系,直接调用DefaultHttpRequester的RequestAsync方法,绕过BrowsingContext的自动头修改逻辑即可。
内容的提问来源于stack exchange,提问作者fass33443423
相关产品推荐
相关产品推荐

