我理解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团队成员。
答案 0 :(得分:15)
路由前缀与属性路由中的设计相关联。
它用于为整个控制器设置公共前缀。
如果您阅读了介绍该功能的发行说明,您可以更好地了解该主题。
属性路由
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
关于这个主题的非常好的文章
虽然没有关于这个问题的专家,但这是我对其工作原理的理解。
使用属性路由,框架会检查控制器操作的路由属性,以便创建要添加到路由表的路由条目。因此,只要您使用属性路由,就可以使用[RouteAttribute]
。如果没有此属性,操作将默认返回基于约定的路由。 RoutePrefixAttribute
是一个可扩展点,可让您更好地控制定义路由/网址的方式。发行说明同样多。
除了我的理解和提供的最后一个链接之外,其他所有内容都是从MS文档中引用的。
答案 1 :(得分:4)
对于权威来源,以下是MSDN(强调我的)的描述。
放置控制器或操作以通过路径直接公开。放置在控制器上时,它适用于没有任何System.Web.Mvc.RouteAttribute的操作。
使用适用于控制器内所有操作的路由前缀来注释控制器。
正如您所看到的,Route
的说明提到了公开行动,但RoutePrefix
没有。