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

ASP.NET Core 7 Web API调用返回NotFound问题排查求助

ASP.NET Core 7 API返回NotFound的问题排查与解决

核心问题点及修正方案

1. 控制器基类错误

你当前使用的System.Web.Http.ApiController是.NET Framework时代ASP.NET Web API的基类,并不适用于ASP.NET Core。ASP.NET Core的API控制器应继承Microsoft.AspNetCore.Mvc.ControllerBase(或Controller),并引用对应的命名空间。

2. 路由配置重复冲突

控制器上的[Route("api/mycontroller")]与Action上的[Route("api/mycontroller/postdata")]重复定义了路由前缀,导致实际生成的路由为api/mycontroller/api/mycontroller/postdata,与你调用的地址api/mycontroller/postdata不匹配,直接触发NotFound。

3. 参数绑定规则不匹配

客户端发送的是JSON格式的请求体,但Action的参数未指定绑定来源。ASP.NET Core默认会从QueryString绑定param1,不会自动读取请求体中的JSON内容,导致无法匹配到正确的Action重载。

4. 中间件顺序错误

ASP.NET Core中间件执行顺序有严格要求,app.UseRouting()必须放在app.UseAuthorization()之前,否则路由匹配逻辑会在授权之后执行,导致无法正确解析请求路由。


修正后的完整代码

控制器代码

using Microsoft.AspNetCore.Mvc;

// 使用ASP.NET Core标准路由约定,自动替换控制器名称
[Route("api/[controller]")]
// 启用API控制器约定,自动处理请求体绑定、模型验证等
[ApiController]
public class MyController : ControllerBase
{
    // 仅定义相对路由,最终完整路由为api/mycontroller/postdata
    [HttpPost("postdata")]
    // 用[FromBody]指定从请求体绑定参数,同时使用强类型模型替代dynamic提升类型安全
    public IActionResult PostData([FromBody] RequestModel model)
    {
        return Ok(new { Message = "Data received", Param1 = model.Param1, Param2 = model.Param2 });
    }
}

// 定义强类型请求模型
public class RequestModel
{
    public string Param1 { get; set; }
    public dynamic Param2 { get; set; }
}

Program.cs代码

builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();
// 调整路由中间件到授权之前
app.UseRouting();
app.UseAuthorization();
app.MapControllers();

app.Run();

客户端代码(无需修改)

string url = "http://localhost:5299/api/mycontroller/postdata";
string param1 = "Hello, World!";
var param2 = new { Property1 = "Value1", Property2 = 42 };

using (HttpClient client = new HttpClient())
{
    var jsonContent = JsonSerializer.Serialize(new { param1, param2 });
    var content = new StringContent(jsonContent, Encoding.UTF8, "application/json");

    HttpResponseMessage response = await client.PostAsync(url, content);
    if (response.IsSuccessStatusCode)
    {
        string responseBody = await response.Content.ReadAsStringAsync();
        Console.WriteLine("Response: " + responseBody);
    }
    else
    {
        Console.WriteLine("Error: " + response.StatusCode);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 05:12:40