AJAX调用控制器GetGtmGrid接口返回404错误如何排查解决
AJAX调用ASP.NET Core接口返回404问题排查
问题背景
AJAX发起GET请求调用控制器Action时始终返回404错误,其余同配置模式的接口可正常运行。
控制器代码(C#)
[HttpGet("~/TIB/Forms/GetGtmGrid")] public IEnumerable<object> GetGtmGrid(int? id) { DataTable dtbl = new DataTable(); using (SqlConnection sqlConnection = new SqlConnection(_configuration.GetConnectionString("DB"))) { sqlConnection.Open(); SqlDataAdapter sqlData = new SqlDataAdapter("usp_GetGTMNotesById", sqlConnection); sqlData.SelectCommand.CommandType = CommandType.StoredProcedure; sqlData.SelectCommand.Parameters.AddWithValue("Id", id); sqlData.Fill(dtbl); } List<GTMNote> gtmNotes = new List<GTMNote>(); for (int i = 0; i < dtbl.Rows.Count; i++) { gtmNotes.Add(new GTMNote { Id = Convert.ToInt32(dtbl.Rows[i]["Id"]), Text = dtbl.Rows[i]["Text"].ToString(), ProjectId = Convert.ToInt32(dtbl.Rows[i]["ProjectId"]), Date = (DateTime)dtbl.Rows[0]["Date"], StatusId = Convert.ToInt32(dtbl.Rows[i]["StatusId"]) }); } GTMNote[] gtmArray = gtmNotes.ToArray(); return gtmArray; }
AJAX调用代码(JavaScript/jQuery)
$.ajax({ url: "/TIB/Forms/GetGtmGrid", type: "GET", dataType: "json", // 向控制器传递参数 data: { id: id } })
报错信息
GET
https://localhost:<port>/TIB/Forms/GetGtmGrid?id=428404
排查与修复方案
- 优先排查路由配置冲突:当前Action使用
~开头的绝对路由[HttpGet("~/TIB/Forms/GetGtmGrid")],这种写法会跳过控制器上的路由前缀、区域路由约束直接注册端点。如果其余同路径接口是通过控制器级[Route("TIB/Forms")]+Action级[HttpGet("GetGtmGrid")]的方式注册,建议改成和其他正常接口一致的路由写法,避免全局路由模板、区域路由规则拦截导致匹配失败。 - 显式指定参数绑定源:如果项目全局开启了
[ApiController]特性,部分版本的ASP.NET Core会对简单类型参数的绑定源推断失败,导致路由匹配时找不到符合参数要求的端点。给id参数显式添加[FromQuery]特性,明确指定从查询字符串取参:public IEnumerable<object> GetGtmGrid([FromQuery] int? id) - 排查重复路由定义:全局搜索代码库中是否存在其他同路径的Action定义,包括无参重载、参数类型不匹配的同路径路由。ASP.NET Core路由按注册顺序匹配,若存在同路径但参数约束不匹配的端点,会直接返回404,不会继续匹配后续符合条件的端点。
- 开启路由调试日志定位根因:在应用启动配置中添加路由日志过滤,将路由匹配日志级别设为Trace,请求发起后可在控制台看到完整的路由匹配过程,直接定位未命中目标Action的具体原因:
// Program.cs中,在注册控制器服务前添加 builder.Logging.AddFilter("Microsoft.AspNetCore.Routing", LogLevel.Trace); - 附带逻辑bug修复:当前循环中
Date = (DateTime)dtbl.Rows[0]["Date"]始终取第一行数据的日期字段,会导致所有返回条目日期错误,应修改为Date = (DateTime)dtbl.Rows[i]["Date"],该问题不会触发404,但会导致返回数据不符合预期。
内容的提问来源于stack exchange,提问作者NerdyDriod
相关产品推荐
相关产品推荐

