.NET Framework前端调用Department API出现404错误求助
排查.NET Framework API 404错误的解决方案
1. 核心问题:API路径与控制器Action不匹配
你在constants.cs中定义的API路径(如Department/Save、Department/Update、Department/Search),但DepartmentController中没有对应名称的Action方法:
- 常量声明了
Department/Search,但控制器里是Department_Read和Department_Search,默认路由会映射到Department/Department_Read而非Department/Search - 完全缺失
Save、Update对应的Action实现 Department_Delete对应的常量是Department/Delete,但Action名称是Department_Delete,默认路由会指向Department/Department_Delete,与前端请求路径不匹配
修复方法:统一路径与Action映射
方式一:给Action添加路由属性(推荐)
通过[Route]属性直接指定Action对应的API路径,确保与constants.cs中的声明一致:
public class DepartmentController : Controller { // 匹配 Department/Search [HttpPost] [Route("Department/Search")] public async Task<ActionResult> Department_Read([DataSourceRequest] DataSourceRequest request) { // 原有逻辑... } // 若需区分基础搜索和高级搜索,可调整路由 [HttpPost] [Route("Department/Search/Advanced")] public async Task<ActionResult> Department_Search([DataSourceRequest] DataSourceRequest request) { // 原有逻辑... } // 匹配 Department/Delete [HttpPost] [Route("Department/Delete")] public async Task<ActionResult> Department_Delete([DataSourceRequest] DataSourceRequest request, string searchQuery) { // 原有逻辑... } // 补充缺失的Save接口 [HttpPost] [Route("Department/Save")] public async Task<ActionResult> Department_Save(DepartmentModel model) { var userData = Security.GetUserSecurityData(Request.Cookies); var saveResult = await APICall.PostData<DepartmentModel>(Constants.DepartmentSave, new { UserId = userData.UserID, Username = userData.UserName, Key = userData.Key, BusinessUnitId = userData.nBusinessUnitID, BranchId = userData.nBranchID, DepartmentData = model }); return saveResult?.Status == true ? Json(new { Success = true, Message = "Department saved successfully." }) : Json(new { Success = false, Message = "Failed to save department." }); } // 补充缺失的Update接口 [HttpPost] [Route("Department/Update")] public async Task<ActionResult> Department_Update(DepartmentModel model) { var userData = Security.GetUserSecurityData(Request.Cookies); var updateResult = await APICall.PostData<DepartmentModel>(Constants.DepartmentUpdate, new { UserId = userData.UserID, Username = userData.UserName, Key = userData.Key, BusinessUnitId = userData.nBusinessUnitID, BranchId = userData.nBranchID, DepartmentData = model }); return updateResult?.Status == true ? Json(new { Success = true, Message = "Department updated successfully." }) : Json(new { Success = false, Message = "Failed to update department." }); } }
方式二:调整Action名称与路径一致
把Action名称改成和常量中的路径完全匹配,依赖MVC默认路由{controller}/{action}自动映射:
public async Task<ActionResult> Search([DataSourceRequest] DataSourceRequest request) { // 原有Department_Read的逻辑 } public async Task<ActionResult> Delete([DataSourceRequest] DataSourceRequest request, string searchQuery) { // 原有Department_Delete的逻辑 }
2. 确保HTTP请求方法匹配
MVC控制器Action默认接受GET请求,若前端用POST调用,必须给Action添加[HttpPost]属性,否则会因请求方法不匹配返回404。
3. 全局路由配置检查
确认RouteConfig.cs中的默认路由配置正确:
public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } }
如果是Web API混合项目,需确保WebApiConfig.cs的路由注册在MVC路由之前:
public static class WebApiConfig { public static void Register(HttpConfiguration config) { config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); } }
4. 前端请求路径验证
用浏览器开发者工具(F12)查看前端请求的完整URL,确认HrisBaseUrl是否包含正确的域名/端口,路径是否与后端配置完全一致,排查拼写或路径拼接错误。
5. 参数绑定问题
比如Department_Delete中的searchQuery参数,若前端未传递或参数名称不匹配,可能导致请求无法匹配到Action。可通过[FromQuery]或[FromBody]明确参数来源:
public async Task<ActionResult> Department_Delete([DataSourceRequest] DataSourceRequest request, [FromQuery]string searchQuery) { // 逻辑... }
内容的提问来源于stack exchange,提问作者Ehsan Qureshi
相关产品推荐
相关产品推荐

