RoutePrefix 与路由

RoutePrefix vs Route

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

添加路由的原因

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

编辑 澄清我的问题

不起作用

[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 不会向路由 table 添加任何内容。 RoutePrefix 本身不会生成路由。 这似乎是常识,我想找到一个可信的来源,比如 Microsoft 官方文档,说明这是为什么。

路由前缀在属性路由中与路由相关联。

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

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

ASP.NET Web API 2

Attribute routing

ASP.NET Web API now supports attribute routing, thanks to a contribution by Tim McCall. With attribute routing you can specify your Web API routes by annotating your actions and controllers like this:

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

Attribute routing gives you more control over the URIs in your web API. For example, you can easily define a resource hierarchy using a single API controller:

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

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

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

除我的理解和最后提供的 link 外,其他所有内容均引用自 MS 文档。

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

RouteAttribute

Place on a controller or action to expose it directly via a route. When placed on a controller, it applies to actions that do not have any System.Web.Mvc.RouteAttribute’s on them.

RoutePrefixAttribute

Annotates a controller with a route prefix that applies to all actions within the controller.

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