RestClient请求接口正常但HttpWebRequest返回403,求原因及修复方案
问题成因
- RestClient默认会自动填充
User-Agent、Accept等标准HTTP请求头,而原生HttpWebRequest默认不会主动设置这些头,目标站点的WAF/CDN规则拦截了缺少必要头的请求,直接返回403禁止访问。 - 除此之外
HttpWebRequest默认的TLS版本可能不符合目标站点要求,目前绝大多数站点已经不再支持旧版TLS 1.0/1.1,默认配置如果没有启用高版本TLS也会触发拦截。
修复方案
无需修改现有业务逻辑,只需要给HttpWebRequest补充必要配置即可,修改后的代码如下:
// TLS版本全局配置,建议放在程序启动入口处,无需重复设置 // 如果是低版本.NET Framework不支持Tls13,仅保留Tls12即可 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls13; HttpWebRequest httpsRequest = (HttpWebRequest) WebRequest.Create(source); httpsRequest.Method = "GET"; // 补充合法的User-Agent头,可根据实际场景替换为其他合法UA值 httpsRequest.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"; // 补充匹配XML请求的Accept头 httpsRequest.Accept = "application/xml, text/xml, */*"; var response = httpsRequest.GetResponse();
少数严格的站点如果仍返回403,可额外补充httpsRequest.Headers.Add("Accept-Language", "zh-CN,zh;q=0.9")增加语言头即可。
内容的提问来源于stack exchange,提问作者jcmag
相关产品推荐
相关产品推荐

