我在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}
的路由时提到过这个问题。
id
是可选的,那么像/api/{part1}/{part2}
这样的 URL,如果无法找到匹配的操作,则仍会进入DefaultApi
路由。如果我说错了,请纠正我。 - orad