最佳答案
我有 Global.asax 中的默认路由:
RouteTable.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
我希望能够针对一个特定的功能,所以我创建了另一条路线:
RouteTable.Routes.MapHttpRoute(
name: "WithActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
所以,在我的控制器中,我有:
public string Get(int id)
{
return "object of id id";
}
[HttpGet]
public IEnumerable<string> ByCategoryId(int id)
{
return new string[] { "byCategory1", "byCategory2" };
}
打电话给 .../api/records/bycategoryid/5
就能得到我想要的。
但是,调用 .../api/records/1
会给我错误吗
找到了与请求匹配的多个操作: ..。
我明白这是为什么-路由只是定义什么 URL 是有效的,但是当涉及到函数匹配时,Get(int id)
和 ByCategoryId(int id)
都匹配 api/{controller}/{id}
,这是什么 混乱的框架。
我需要做什么才能让默认的 API 路由重新工作,并保持与 {action}
的路由?我考虑创建一个名为 RecordByCategoryIdController
的不同控制器来匹配缺省 API 路由,为此我将请求 .../api/recordbycategoryid/5
。然而,我发现这是一个“肮脏”(因此不令人满意)的解决方案。我一直在寻找这个问题的答案,但是没有一个关于使用 {action}
路线的教程甚至提到了这个问题。