RoutePrefix与路由

时间:2016-04-11 19:46:51

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

我理解RoutePrefix本身不会向路由表添加路由。在您的操作中,您需要声明Route属性。我很难找到一个权威的博客/ msdn页面/一些东西,说明为什么defalut 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;}
}

上述方案有效,因为我们明确声明get上的SteveController操作有一条空路线。一旦我们这样做,路线就会被添加到RouteTable

第一种情况不起作用,因为仅使用RoutePrefix不会向路由表添加任何内容。 RoutePrefix本身不会生成路由。 这似乎是常识,我想知道一个说明原因的来源。优先受尊敬的社区成员,即Jon Skeet或Microsoft团队成员。

2 个答案:

答案 0 :(得分:15)

路由前缀与属性路由中的设计相关联。

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

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

ASP.NET Web API 2

  

属性路由

     

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

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

属性路由使您可以更好地控制Web中的URI   API。例如,您可以使用a轻松定义资源层次结构   单个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文档中引用的。

答案 1 :(得分:4)

对于权威来源,以下是MSDN(强调我的)的描述。

RouteAttribute

  

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

RoutePrefixAttribute

  

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

正如您所看到的,Route的说明提到了公开行动,但RoutePrefix没有。