![](/img/trans.png)
[英]Post Action method overload with same route name in ASP.Net Web API Controller
[英]Adding an explicit action route to ASP.NET Web API Controller
我有一個帶有ApiController
的ASP.NET Web API項目,它為User
端點提供以下操作:
GET /api/User
POST /api/User
DELETE /api/user
我想提供以下端點:
GET /api/user/metrics
但是,當我像這樣定義控制器動作時:
[HttpGet]
public HttpResponseMessage Metrics()
{
return null;
}
我Multiple actions were found that match the request
錯誤消息的Multiple actions were found that match the request
。
我理解這違反了“純”REST API的定義,但這就是我想要的方式。 我想我必須通過映射HTTP路由來解決這個問題,但是我嘗試了一些路由而且我無法讓它工作。 我的路線應該是什么樣的?
默認路由不包括操作。
routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
它根據路由器中的控制器,HTTP謂詞和參數或缺少參數來選擇操作。 因此,它找到了正確的控制器並尋找沒有參數的GET動作。 它找到兩個。
您應該添加包含該操作的其他路由。 這可以通過Kiran提到的基於屬性的路由或基於約定的路由來完成。 對於基於約定的路由,路由通常放在WebApiConfig.cs
的Application_start()
方法中。 更具體的路線在一般路線之前,所以你的路線看起來像這樣:
config.Routes.MapHttpRoute(
name: "ApiWithAction",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
如果您使用的是Web API 2,我建議使用屬性路由,這樣可以使這些場景更容易體驗。
您可以繼續使用默認的常規路由來處理大多數場景,但可以在需要的位置使用屬性路由,就像在當前場景中一樣。
以下示例演示了類似的情況:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.