RoutePrefix与路由

gh9*_*gh9 23 c# asp.net-web-api attributerouting asp.net-web-api-routing asp.net-web-api2

据我所知,这RoutePrefix不会自己添加到路由表的路由.在您的操作上,您需要Route声明一个属性.我很难找到一个权威的博客/ msdn页面/一些东西,说明为什么defalut RoutePrefix不会添加到路由表的路由.

有没有人有一个确实含有此权威的权威帖子,如果是这样,你会告诉我它是谁.非常感谢你.

编辑 以澄清我的问题

什么都不行

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

作品

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

上面的场景是有效的,因为我们明确表示对该路径的get操作SteveController有一条空路线.一旦我们这样做,路线就会被添加到RouteTable

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

Nko*_*osi 19

路由前缀在属性路由中按设计与路由相关联.

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

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

ASP.NET Web API 2

属性路由

由于Tim McCall的贡献,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) { } 
} 
Run Code Online (Sandbox Code Playgroud)

通过属性路由,您可以更好地控制Web API中的URI.例如,您可以使用单个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) { } 
} 
Run Code Online (Sandbox Code Playgroud)

ASP.NET Web API 2.1中的新增功能

ASP.NET Web API 2.2中的新增功能

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

ASP.NET 5 Deep Dive:路由

虽然没有关于这个主题的专家,但我的理解是如何运作的.

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

除了我的理解和提供的最后一个链接,其他一切都是从MS文档中引用的.

  • 赞成你...但想在 2023 年添加 ASP.NET Core,他们摆脱了 RoutePrefix,作为旧 WebAPI 2 库 (Microsoft.AspNet.WebApi.Core) 的一部分。在 ASP.NET Core 7 中,他们将 MVC 和 WebAPI 合并到一个新的 MVC 主库中,两者现在都有一个模型,接近相同,但仅使用“[Route]”。示例:MVC 控制器属性是可选的,现在如下所示: [Route("[controller]/[action]")] (默认路由)和 WebAPI 属性不是可选的,如下所示: [ApiController][Route("api /[controller]")] (webapi 总是使用属性)哈哈,还有其他人感到困惑吗? (2认同)

Rob*_*nis 8

有关权威信息,请参见MSDN(重点我的)中的说明。

RouteAttribute

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

RoutePrefixAttribute

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

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