我在 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 是有效的,但是当涉及到函数匹配时,bothGet(int id)
和ByCategoryId(int id)
match使框架api/{controller}/{id}
感到困惑。
我需要做什么才能让默认的 API 路由再次工作,并保留它{action}
?我想创建一个不同的控制器,命名RecordByCategoryIdController
为匹配默认的 API 路由,我会为此请求.../api/recordbycategoryid/5
. 但是,我发现这是一个“肮脏”(因此不令人满意)的解决方案。我一直在寻找这方面的答案,但没有关于使用路线的教程{action}
甚至提到这个问题。