我在Global.asax中的默認路由:的Web API路由 - API/{控制器}/{行動} /(編號) 「功能障礙」 API/{控制器}/{ID}
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}
甚至提到這個問題的路線。
我試過上面的建議,一切都按預期工作。非常感謝你的「祕密」。 –
在你的答案的第2點,如果'id'是可選的,那麼如果'WithActionApi'路由沒有找到匹配的動作,那麼像'/ api/{part1}/{part2}'這樣的URL仍然可以進入'DefaultApi'路由。如果我錯了,請糾正我。 – orad