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

.NET调用外部GET接口返回404但Postman正常,求解决方法

问题描述

我是编程新手,用Postman、React/Next.js和.NET做本地CRUD操作完全没问题,但调用外部站点接口时遇到了麻烦:Postman里用指定URL和Token发送GET请求能拿到成功响应,但我的.NET控制器代码调用时却返回404错误。以下是我的控制器代码,求正确的实现示例。

[HttpGet("externalSite")] 
[Authorize] 
public async Task<IActionResult> callOtherSite()
{ 
    try
    {
        HttpClient client = new HttpClient();
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "asasasasEXAMPLEasasasas");
        HttpResponseMessage response = await client.GetAsync("https://apirenaper.idear.gov.ar/CHUTROFINAL/apidatos/test/aviso_fallecimiento_clientes_registrados.php");
        if (response.StatusCode == HttpStatusCode.OK) {
            var json = await response.Content.ReadAsStringAsync();
            var benefList = JsonConvert.DeserializeObject<List<benef>>(json);

            return Ok(benefList);
        } else {
            return StatusCode(400, "errror");
        }
    } catch (Exception ex) {
        // Logear el error
        // ...

        // Devolver un error
        return StatusCode(500, ex.Message);
    }
}
问题排查与正确实现

可能的404诱因

  • HttpClient滥用:每次请求新建HttpClient会耗尽连接池,可能导致请求异常,表现为404(实际是连接层面的问题)
  • 请求头缺失:Postman会自动添加User-Agent等默认请求头,而你的代码未配置,可能被外部服务端拒绝
  • 环境差异:服务器端的代理、防火墙可能拦截了请求,本地Postman不受限制但后端代码无法正常访问

正确实现示例

首先在Program.cs中注册HttpClient工厂(.NET官方推荐用法):

builder.Services.AddHttpClient();

然后修改控制器代码:

[HttpGet("externalSite")]
[Authorize]
public async Task<IActionResult> CallOtherSite([FromServices] IHttpClientFactory httpClientFactory)
{
    try
    {
        var client = httpClientFactory.CreateClient();
        
        // 补充Postman默认携带的请求头,比如User-Agent
        client.DefaultRequestHeaders.UserAgent.ParseAdd("PostmanRuntime/7.32.3");
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "asasasasEXAMPLEasasasas");
        // 设置合理超时
        client.Timeout = TimeSpan.FromSeconds(30);
        
        var requestUrl = "https://apirenaper.idear.gov.ar/CHUTROFINAL/apidatos/test/aviso_fallecimiento_clientes_registrados.php";
        HttpResponseMessage response = await client.GetAsync(requestUrl);

        // 自动抛出HTTP错误状态码对应的异常,方便精准捕获
        response.EnsureSuccessStatusCode();
        
        var json = await response.Content.ReadAsStringAsync();
        var benefList = JsonConvert.DeserializeObject<List<benef>>(json);

        return Ok(benefList);
    }
    catch (HttpRequestException ex)
    {
        // 捕获HTTP请求相关错误,返回对应状态码和详细信息
        return StatusCode((int)ex.StatusCode, $"外部接口请求失败:{ex.Message}");
    }
    catch (Exception ex)
    {
        return StatusCode(500, $"服务器内部错误:{ex.Message}");
    }
}

额外调试建议

  • 调试时打印响应的完整状态码、响应头和内容,确认是否真的是404,还是其他错误被误判
  • 对比Postman和代码里的请求头,确保所有必要头信息一致
  • 验证代码中的Token与Postman使用的完全一致,无拼写错误或过期情况

内容的提问来源于stack exchange,提问作者luis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 05:25:05