C# RoutePrefix vs Route

C# RoutePrefix vs Route,c#,asp.net-web-api,asp.net-web-api2,asp.net-web-api-routing,attributerouting,C#,Asp.net Web Api,Asp.net Web Api2,Asp.net Web Api Routing,Attributerouting,我知道RoutePrefix本身不会将路由添加到路由表中。在您的操作中,需要声明路由属性。我很难找到一个权威的博客/msdn页面/说明为什么defalutRoutePrefix没有将路由添加到路由表中的内容 是否有人有一个权威的职位,确实包含这一情况,如果是这样,你会让我知道它是谁。多谢各位 编辑 澄清我的问题 不起作用 [RoutePrefix("api/Steve")] public class SteveController : ApiController {

我知道
RoutePrefix
本身不会将路由添加到路由表中。在您的操作中,需要声明
路由
属性。我很难找到一个权威的博客/msdn页面/说明为什么defalut
RoutePrefix
没有将路由添加到路由表中的内容

是否有人有一个权威的职位,确实包含这一情况,如果是这样,你会让我知道它是谁。多谢各位

编辑 澄清我的问题

不起作用

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

上述场景之所以有效,是因为我们明确指出
SteveController
上的
get
操作具有空路由。一旦我们这样做,路由将被添加到
RouteTable

第一个场景不起作用,因为仅使用
RoutePrefix
不会向路由表添加任何内容
RoutePrefix本身不会生成路由。

这似乎是常识,我想找到一个可信的来源,如Microsoft官方文档,说明原因。路由前缀与属性路由中的设计路由相关联

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

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

属性路由

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

属性路由使您能够更好地控制web中的URI 应用程序编程接口。例如,您可以使用 单API控制器:

公共类电影控制器:ApiController
{ 
[路线(“电影”)]
公共IEnumerable Get(){}
[路线(“演员/{actorId}/电影”)]
公共IEnumerable GetByActor(int-actorId){}
[路线(“导演/{directorId}/电影”)]
公共IEnumerable GetByDirector(int directorId){}
} 

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

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

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


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

对于权威来源,以下是MSDN(我的重点)中的描述

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

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


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

这些文章非常好,非常有助于理解基础知识,虽然它们没有解决我的问题,但是
RoutePrefix
的定义基本上已经解释了为什么它只适用于rout。它用于在控制器中的路由之间存储
common
前缀。我的问题不是它为什么工作。我希望看到一些资料表明这一点。就我和谷歌而言,这只是每个人都有的普通信息。
[RoutePrefix("api/Steve")]
public class SteveController : ApiController
{
    [Route("")]
    public int get(){return 1000000;}
}
[RoutePrefix("orders")] 
public class OrdersController : ApiController 
{ 
    [Route("{id}")] 
    public Order Get(int id) { } 
    [Route("{id}/approve")] 
    public Order Approve(int id) { } 
} 
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) { } 
}