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
相关产品推荐
相关产品推荐

