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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 00:50:00