【发布时间】:2012-11-28 01:39:17
【问题描述】:
我在 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} 的路线的教程甚至提到这个问题。
【问题讨论】:
标签: asp.net routing controller asp.net-web-api action