我有一个控制器,其中定义了以下操作:
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 :(得分: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