WebAPI 2 的 RoutePrefix Order 替代品

RoutePrefix Order alternative for WebAPI 2

在 WebAPI 中,您可以在 RouteAttribute 中指定一个 Order 来确定路由匹配的顺序。例如,下面将匹配 /otherGetOther 之前匹配 /blahGetByName

[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 属性)在调用 /foo/bar 时抛出以下消息:

Multiple controller types were found that match the URL

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

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

当您在操作的 RouteAttribute 上指定 Order 属性 时,您指定的顺序 仅在控制器内

据我所知,属性路由算法将按字母顺序扫描所有控制器。然后在每个控制器内,将使用任何 RouteAttributeOrder 属性 来决定该控制器内的动作路线顺序。

这意味着如果您的路线冲突分布在不同的控制器上,您应该重新考虑设计或确保具有更具体路线模式的控制器按字母顺序在具有更通用路线模式的控制器之前按字母顺序命名。否则,您可能 运行 进入那个 "ambiguous route / multiple actions with matching routes found" 异常。

更新: 上面的答案是针对 Microsoft 的 AttributeRouting 实现的,即 based on another very popular open source project that came before MVC5。在该库中,您可以通过控制器订购属性路由,但我认为 属性 是 SiteOrder 或类似的东西。

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

@foreach (var group in apiGroups.OrderBy(g => g.Key.ControllerName))