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页面/说明为什么defalutRoutePrefix
没有将路由添加到路由表中的内容
是否有人有一个权威的职位,确实包含这一情况,如果是这样,你会让我知道它是谁。多谢各位
编辑
澄清我的问题
不起作用
[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) { }
}