Postman与Python可正常发起的HTTP请求,C#中返回404错误求助
解决C# WebRequest请求返回404但Postman/Python正常的问题
问题说明
使用C#的WebRequest发起GET请求到http://oneom.is/ep时返回404错误,但相同请求在Postman和Python中可正常运行,C#代码如下:
public void GetTorrentsTest3() { var url = "http://oneom.is/ep"; var request = WebRequest.Create(url); request.Method = "GET"; using var webResponse = request.GetResponse(); using var webStream = webResponse.GetResponseStream(); using var reader = new StreamReader(webStream); var data = reader.ReadToEnd(); Console.WriteLine(data); }
从Postman截图可见,请求携带了完整的浏览器标识请求头,而WebRequest默认不会自动添加这类头信息,这大概率是服务器返回404的核心原因。
解决思路及代码示例
1. 添加必要请求头(重点是User-Agent)
多数服务器会校验请求的User-Agent字段,拒绝无标识或标识为非浏览器的请求。直接复制Postman中的请求头添加到WebRequest中:
public void GetTorrentsTest3() { var url = "http://oneom.is/ep"; var request = WebRequest.Create(url); request.Method = "GET"; // 复制Postman中的关键请求头,至少包含User-Agent request.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"); request.Headers.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); request.Headers.Add("Accept-Encoding", "gzip, deflate"); request.Headers.Add("Accept-Language", "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3"); try { using var webResponse = request.GetResponse(); using var webStream = webResponse.GetResponseStream(); using var reader = new StreamReader(webStream); var data = reader.ReadToEnd(); Console.WriteLine(data); } catch (WebException ex) { // 捕获异常并读取错误响应内容,方便排查 using var errorStream = ex.Response.GetResponseStream(); using var reader = new StreamReader(errorStream); var errorData = reader.ReadToEnd(); Console.WriteLine("错误响应:" + errorData); } }
2. 手动启用重定向处理
部分服务器会返回3xx重定向,虽然WebRequest默认支持自动重定向,但可以显式配置确保生效:
request.AllowAutoRedirect = true; request.MaximumAutomaticRedirections = 5;
3. 改用更现代的HttpClient替代WebRequest
WebRequest是较老旧的API,微软推荐使用HttpClient,它的默认配置更贴近现代请求场景,代码也更简洁:
public async Task GetTorrentsTest3() { var url = "http://oneom.is/ep"; using var client = new HttpClient(); // 添加请求头 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/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); try { var data = await client.GetStringAsync(url); Console.WriteLine(data); } catch (HttpRequestException ex) { Console.WriteLine("请求异常:" + ex.Message); // 读取错误响应详情 if (ex.InnerException is WebException webEx && webEx.Response != null) { using var errorStream = webEx.Response.GetResponseStream(); using var reader = new StreamReader(errorStream); var errorData = reader.ReadToEnd(); Console.WriteLine("错误响应:" + errorData); } } }
4. 校验URL一致性
确认Postman中的URL与C#代码中的URL完全一致,包括是否有尾随斜杠、大小写差异等(少数服务器会严格校验这些细节)。
内容的提问来源于stack exchange,提问作者Gordon
相关产品推荐
相关产品推荐

