You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 13:35:41