RoutePrefix WebAPI 2的订购替代方案

时间:2015-02-27 16:21:27

标签: c# asp.net-web-api2 attributerouting

在WebAPI中,您可以在Order中指定RouteAttribute以确定路由匹配的顺序。例如,在匹配{之前,下面的内容会匹配/otherGetOther {1}}至/blah

GetByName

我如何使用[HttpGet, Route("{name}", Order = 1)] public string GetByName(string name) { ... } [HttpGet, Route("other")] public string GetOther() { ... } (没有RoutePrefix属性)做同样的事情?如果它确实如此,那将是这样的:

Order

执行上述操作(没有虚构的[RoutePrefix("foo", Order = 1)] public class FooController : ApiController { ... } [RoutePrefix("foo/bar")] public class FooBarController : ApiController { ... } 属性)在调用Order时会抛出以下消息:

  

找到了与网址匹配的多种控制器类型

是否存在解决此问题的现有功能(最好使用属性)?

2 个答案:

答案 0 :(得分:2)

我不相信 Microsoft 属性路由支持按控制器排序路由。

在操作Order上指定RouteAttribute属性时,您只在控制器中指定订单

AFAIK,属性路由算法将按字母顺序扫描所有控制器。然后在每个控制器中,将使用任何Order的{​​{1}}属性来确定该控制器内的动作路由的顺序。

这意味着如果路径冲突分布在不同的控制器上,则应重新考虑设计或确保具有更具体路由模式的控制器在具有更一般路由模式的控制器之前按字母顺序命名。否则,您可能会遇到"模糊路由/多个操作,并找到匹配的路由"异常。

更新:以上答案适用于Microsoft的AttributeRouting实施,即based on another very popular open source project that came before MVC5。在该库中,您可以按控制器排序属性路由,但我认为该属性为RouteAttribute或类似的东西。

答案 1 :(得分:0)

您可以在index.cshtml中为循环添加一个orderby:

f1