簡體   English   中英

向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.csApplication_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,我建議使用屬性路由,這樣可以使這些場景更容易體驗。

您可以繼續使用默認的常規路由來處理大多數場景,但可以在需要的位置使用屬性路由,就像在當前場景中一樣。

以下示例演示了類似的情況:

http://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/WebApiAttributeRoutingSample/WebApiAttributeRoutingSample/Controllers/Api/CustomersController.cs

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM