【问题标题】:RoutePrefix Order alternative for WebAPI 2WebAPI 2 的 RoutePrefix 顺序替代
【发布时间】:2015-02-27 16:21:26
【问题描述】:

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

[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 时会引发以下消息:

找到多个与 URL 匹配的控制器类型

是否有解决此问题的现有功能(最好带有属性)?

【问题讨论】:

  • 老实说,即使我回答了这个问题,对我来说也没有任何意义。 RoutePrefix 本身并没有声明路由,因此它不能有任何Order。相反,它是其控制器中所有路由属性操作的前缀。所以你不能订购它,因为它只是一个前缀。除非您说您希望所有具有该前缀(在该控制器中)的路由在具有另一个前缀(在不同控制器中)的路由之前注册。我的观点是你需要一个完全不同的属性,比如RoutingPrecedenceAttribute,它可能有Order

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


【解决方案1】:

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

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

AFAIK,属性路由算法将按字母顺序扫描所有控制器。然后在每个控制器内,将使用任何 RouteAttributes 的 Order 属性来决定该控制器内的操作路由顺序。

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

更新:上面的答案是针对微软的 AttributeRouting 实现的,它是 based on another very popular open source project that came before MVC5。在那个库中,您可以通过控制器对属性路由进行排序,尽管我认为该属性是 SiteOrder 或类似的东西。

【讨论】:

  • 你的意思是我可以(理论上,但有点恶心)用上面的[RoutePrefix]es 做AFooBarControllerBFooController
  • @dav_i 是的,我认为你可以。试试看,看看它是否能解决您要解决的问题。将它放在按字母顺序排列的不同文件夹或命名空间中也可以解决问题。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2017-01-28
    • 1970-01-01
    • 2016-09-26
    • 2020-03-17
    • 2021-05-31
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    • 2017-09-04
    相关资源
    最近更新 更多