.NET中HttpClient重复请求返回403但Postman、Python请求正常如何解决
问题原因
你出现403错误的核心原因是HttpClient为静态单例实例,你在循环中重复调用DefaultRequestHeaders.Add("apikey", "myPassword"),会导致请求头中累计追加多个apikey字段,服务端校验时识别到异常的多值请求头,直接返回403。Python和Postman请求时每次都是独立的请求头配置,不会出现重复追加的问题,因此返回200。
可行解决方案
方案1:每次请求独立配置请求头(推荐)
不要将自定义请求头加到全局的DefaultRequestHeaders,而是每次创建独立的HttpRequestMessage配置请求头,避免全局污染:
private static HttpClient req { get; set; } = new HttpClient(); static async Task Main(string[] args) { Console.WriteLine("Please press enter to start healthCheck"); Console.ReadLine(); // 补充await避免未观察异常 await healthCheck(); Console.ReadLine(); } private static async Task healthCheck() { string strUrl = "http://myUrl"; while (true) { // 每次创建独立的请求消息对象配置头 using var request = new HttpRequestMessage(HttpMethod.Get, strUrl); request.Headers.Add("apikey", "myPassword"); HttpResponseMessage hrm = await req.SendAsync(request); Console.WriteLine("=> statusCode:" + (int)hrm.StatusCode); await Task.Delay(5000); } }
方案2:全局请求头只初始化一次
如果apikey是固定值,直接在HttpClient初始化时配置一次即可,不要放在循环中重复添加:
// 初始化时就加好全局头,不要在循环里重复加 private static HttpClient req { get; set; } = new HttpClient() { DefaultRequestHeaders = { { "apikey", "myPassword" } } }; static async Task Main(string[] args) { Console.WriteLine("Please press enter to start healthCheck"); Console.ReadLine(); await healthCheck(); Console.ReadLine(); } private static async Task healthCheck() { string strUrl = "http://myUrl"; while (true) { HttpResponseMessage hrm = await req.GetAsync(strUrl); Console.WriteLine("=> statusCode:" + (int)hrm.StatusCode); await Task.Delay(5000); } }
补充排查点
如果修改后仍出现403,可补充配置默认User-Agent,部分服务端会拦截无User-Agent的请求:
req.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36");
内容的提问来源于stack exchange,提问作者Amirali Sam
相关产品推荐
相关产品推荐

