2016-03-28 54 views
0

我有以下操作的控制器定義:多個HTTPGET在網絡API控制器動作

public IHttpActionResult Get(int id) {} 

[ActionName("Orders")] 
public IHttpActionResult GetOrders(int id) {} 

我的路由如下:

config.Routes.MapHttpRoute(
    name: "ControllerWithId", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional }, 
    constraints: new { id = @"^[0-9]+$" } 
); 

config.Routes.MapHttpRoute(
    name: "ControllerWithAction", 
    routeTemplate: "api/{controller}/{action}", 
    defaults: new { action = "Get" }, 
    constraints: null 
); 

config.Routes.MapHttpRoute(
    name: "ControllerWithIdAndAction", 
    routeTemplate: "api/{controller}/{id}/{action}", 
    defaults: new { id = RouteParameter.Optional }, 
    constraints: new { id = @"^[0-9]+$" 
}; 

我想打電話給GetOrders爲如下:

/api/Customers/1/Orders 

不過,我得到異常:

多個動作中發現匹配的要求,即:獲取

什麼是在這種情況下,正確的路由?

+0

應指定routeTemplate作爲'api/{controller}/{action}/{id}',特別是當'id'是可選的時。 – Irshu

回答

0

這是因爲您的兩個動作都與第一個路徑模板ControllerWithId匹配!這基本上是因爲你混合使用基於動詞的路由(這是Web-Api中的默認路由機制)和基於動作的路由。你應該堅持其中之一!根據您的控制器和行動上,你可以合併第一和第二航線模板是這樣的:

config.Routes.MapHttpRoute(
name: "ControllerWithAction", 
routeTemplate: "api/{controller}/{action}/{id}", 
defaults: new { id = RouteParameter.Optional, action = "Get" }, 
constraints: null); 

這將涉及您的方案,但如果你想解決更復雜的情況看看Web API: Mixing Traditional & Verb-Based Routing

0

嘗試使用'Route'裝飾器而不是'ActionName'裝飾器。

[Route("{id:int}/orders")] 
相關問題