ApiController 路由似乎忽略了操作

ApiController routing seems to ignore action

在 RouteConfig.cs

中定义了这样的路由
  routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Durandal", action = "Index", id = UrlParameter.Optional }
    );

我希望 http://localhost:50441/api/Induction/GetIntro/4108 解析为

Controller = InductionController
Action = "GetIntro"
Id = 4108

并调用此 class

的 GetIntro 方法
using System.Web.Http;

namespace MyMvcApp.Controllers
{
  public class InductionController : ApiController
  {    
    public object GetIntro(int inductionId)
    {     
      //simplified for brevity    
      return new {
        Title = "foo",
        Text = "Some introductory blather"
      };
    }
  }
}

但事实并非如此。我收到 404 Not Found,迫切的问题是为什么。

大多数示例似乎使用 MapHttpRoute 而不是 MapRoute,MapRoute 是包装 MapHttpRoute 的扩展方法。

您正在尝试 url http://localhost:50441/api/Induction/GetIntro/4108

但您错过了将 'api' 添加到您的路线定义

将您的路线更改为

 routes.MapRoute(
        name: "Default",
        url: "api/{controller}/{action}/{id}",
        defaults: new { controller = "Durandal", action = "Index", id = UrlParameter.Optional }
        );

我对 RouteConfig.cs 的存在感到困惑,它也定义了路由。它是这样工作的:

  • WebApi 路由由 WebApiConfig.cs
  • 配置
  • MVC 路由由 RouteConfig.cs
  • 配置
  • 两者兼得,因为它是一个支持 WebApi 的 MVC 项目。

在我的项目中,在 WebApiConfig.cs 中定义的路由是 api\{controller}\{id},在此之前使用另一条路由 api\{controller}\{action}\{id} 解决了问题。

模板生成的 CRUD 方法有效,因为它们匹配 api\{controller}\{id}