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 官方文档,说明这是为什么。
路由前缀在属性路由中与路由相关联。
用于设置整个控制器的公共前缀。
如果您阅读介绍该功能的发行说明,您可能会更好地理解该主题。
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
关于这个主题的一篇非常好的文章
虽然没有这方面的专家,但这是我对其工作原理的理解。
通过属性路由,框架检查控制器操作的路由属性,以便创建路由条目以添加到路由 table。因此,只要您使用属性路由,您就会使用 [RouteAttribute]
。如果没有此属性,操作将默认返回基于约定的路由。 RoutePrefixAttribute
是一个扩展点,可让您更好地控制定义 routes/Urls 的方式。发行说明说明了这一点。
除我的理解和最后提供的 link 外,其他所有内容均引用自 MS 文档。
对于权威来源,这里是来自 MSDN 的描述(重点是我的)。
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.
Annotates a controller with a route prefix that applies to all actions within the controller.
如您所见,Route
的描述提到了公开操作,但 RoutePrefix
没有。
我了解 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 官方文档,说明这是为什么。
路由前缀在属性路由中与路由相关联。
用于设置整个控制器的公共前缀。
如果您阅读介绍该功能的发行说明,您可能会更好地理解该主题。
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
关于这个主题的一篇非常好的文章
虽然没有这方面的专家,但这是我对其工作原理的理解。
通过属性路由,框架检查控制器操作的路由属性,以便创建路由条目以添加到路由 table。因此,只要您使用属性路由,您就会使用 [RouteAttribute]
。如果没有此属性,操作将默认返回基于约定的路由。 RoutePrefixAttribute
是一个扩展点,可让您更好地控制定义 routes/Urls 的方式。发行说明说明了这一点。
除我的理解和最后提供的 link 外,其他所有内容均引用自 MS 文档。
对于权威来源,这里是来自 MSDN 的描述(重点是我的)。
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.
Annotates a controller with a route prefix that applies to all actions within the controller.
如您所见,Route
的描述提到了公开操作,但 RoutePrefix
没有。