【问题标题】:RoutePrefix vs RouteRoutePrefix 与 Route
【发布时间】:2016-08-02 03:49:14
【问题描述】:

我了解RoutePrefix 本身不会向路由表添加路由。在您的操作中,您需要声明一个 Route 属性。我很难找到权威的博客/msdn 页面/说明为什么默认 RoutePrefix 没有向路由表添加路由的原因。

是否有权威的帖子确实包含这种情况,如果有,请告诉我是谁。非常感谢。

编辑 澄清我的问题

不工作

[RoutePrefix("api/Steve")]
public class SteveController : ApiController
{
    public int get(){return 1000000;}
}

作品

[RoutePrefix("api/Steve")]
public class SteveController : ApiController
{
    [Route("")]
    public int get(){return 1000000;}
}

上述情况有效,因为我们明确指出SteveController 上的get 操作有一个空路由。一旦我们这样做了,路由就会添加到RouteTable

第一种情况不起作用,因为仅使用RoutePrefix 不会向路由表添加任何内容。 RoutePrefix 本身不会生成路由。 这似乎是常识,我想找到一个值得信赖的来源,例如 Microsoft 官方文档,说明为什么会这样。

【问题讨论】:

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


    【解决方案1】:

    对于权威来源,这里是来自 MSDN 的描述(重点是我的)。

    RouteAttribute

    放置在控制器或动作上以通过路由直接暴露它。当放置在控制器上时,它适用于没有任何 System.Web.Mvc.RouteAttribute 的操作。

    RoutePrefixAttribute

    使用适用于控制器内所有操作的路由前缀注释控制器。

    如您所见,Route 的描述提到了公开操作,但 RoutePrefix 没有。

    【讨论】:

      【解决方案2】:

      路由前缀在属性路由中通过设计与路由相关联。

      用于为整个控制器设置一个公共前缀。

      如果您阅读介绍该功能的发行说明,您可能会更好地理解该主题。

      ASP.NET Web API 2

      属性路由

      ASP.NET Web API 现在支持属性路由,这要归功于 蒂姆·麦考尔的贡献。 使用属性路由,您可以通过以下方式指定 Web API 路由 像这样注释你的动作和控制器:

      [RoutePrefix("orders")] 
      public class OrdersController : ApiController 
      { 
          [Route("{id}")] 
          public Order Get(int id) { } 
          [Route("{id}/approve")] 
          public Order Approve(int id) { } 
      } 
      

      属性路由让您可以更好地控制网络中的 URI API。例如,您可以使用 单个 API 控制器:

      public class MoviesController : ApiController 
      { 
          [Route("movies")] 
          public IEnumerable<Movie> Get() { } 
          [Route("actors/{actorId}/movies")] 
          public IEnumerable<Movie> GetByActor(int actorId) { } 
          [Route("directors/{directorId}/movies")] 
          public IEnumerable<Movie> GetByDirector(int directorId) { } 
      } 
      

      What's New in ASP.NET Web API 2.1

      What's New in ASP.NET Web API 2.2

      关于这个主题的一篇非常好的文章

      ASP.NET 5 Deep Dive: Routing

      虽然没有这方面的专家,但这是我对其工作原理的理解。

      使用属性路由,框架会检查控制器操作的路由属性,以便创建路由条目以添加到路由表中。因此,只要您使用属性路由,您就将使用[RouteAttribute]。如果没有此属性,该操作将默认返回基于约定的路由。 RoutePrefixAttribute 是一个可扩展点,可让您更好地控制如何定义路由/网址。发行说明说了这么多。

      除了我的理解和提供的最后一个链接之外,其他所有内容均引用自 MS 文档。

      【讨论】:

      • 这些文章非常好,非常适合理解基础知识,但它们并没有解决我的问题
      • 但是RoutePrefix 的定义基本上已经解释了为什么它只适用于溃败。用于在控制器的路由中存储common前缀。
      • 我的问题不是它为什么有效。 我希望看到一些说明这一点的来源。据我所知和 googlefu,这只是每个人都有的常见信息。
      猜你喜欢
      • 2014-09-22
      • 2016-06-26
      • 1970-01-01
      • 2014-06-23
      • 2014-02-01
      • 2020-07-05
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多