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

Web API方法无法被路由,请求返回404错误求助

解决Web API方法无法路由的404问题

兄弟,我一眼就看出问题出在哪了——你的全局路由模板里没包含action占位符,这就导致路由系统根本识别不了URL里的Test是要调用的方法名!

问题根源分析

你现在用的默认路由是:

config.Routes.MapHttpRoute( 
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
);

这个路由的规则是:api/[控制器名]/[可选id],它只会匹配控制器和id参数。当你请求http://localhost:port/api/Example/Test时,路由系统会把Test当成id的值,而不是要执行的action方法,自然找不到对应的逻辑,返回404。

三种解决方案,按需选

1. 修改全局路由,添加action占位符

直接更新你的WebApiConfig路由,把action加进去:

config.Routes.MapHttpRoute(
    name: "DefaultApiWithAction",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

改完之后,/api/Example/Test就能精准匹配到ExampleController的Test方法了。

2. 用属性路由(推荐,更灵活)

从Web API 2开始支持属性路由,这种方式不用改全局路由,直接在控制器/方法上标记路由规则,更直观:
首先在WebApiConfig里启用属性路由(要放在全局路由注册之前):

config.MapHttpAttributeRoutes(); // 必须先加这行!

// 保留原来的默认路由
config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

然后修改你的控制器:

[RoutePrefix("api/Example")] // 统一前缀
public class ExampleController : ApiController 
{
    [HttpGet]
    [Route("Test")] // 这行指定了方法的路由:api/Example/Test
    public IHttpActionResult Test() 
    {
        return Ok();
    }
}

这样请求就能正常命中方法了,后续加其他方法也能独立配置路由,不会互相干扰。

3. 不修改路由,调整请求URL(仅适合单一Get方法场景)

如果你的控制器只有这一个Get方法,可以去掉[ActionName("Test")],然后请求URL改成http://localhost:port/api/Example——默认路由会自动匹配控制器里的Get方法。但如果有多个Get方法,这种方式就会冲突,不推荐。

额外排查小贴士

  • 确认你的控制器继承的是System.Web.Http.ApiController,不是MVC的Controller(虽然你代码里写对了,但有时候容易搞混)
  • 检查Global.asax里有没有正确注册WebApiConfig:GlobalConfiguration.Configure(WebApiConfig.Register);
  • 看App Insights的请求详情,里面会显示路由匹配的结果,比如它把URL解析成了哪个控制器、参数值是什么,能帮你快速定位路由问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:20:34