Web Api控制器中的多个HttpGet操作

时间:2016-03-28 04:19:06

标签: c# asp.net-web-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

然而,我得到例外:

  

找到与请求匹配的多个操作:获取

在这种情况下,正确的路由是什么?

2 个答案:

答案 0 :(得分:0)

尝试使用'路线'装饰者而不是' ActionName'装饰器。

[Route("{id:int}/orders")]

答案 1 :(得分: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