原文:http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2
属性路由,attribute routing,是web api 2 提供的,而早期的称为约定路由, convention-based routing。在web api 2中,两种可以共存。
以下是原文的思维导图总结:
代码片段:
怎么启用属性路由?
-
public static class WebApiConfig
-
{
-
public static void Register(HttpConfiguration config)
-
{
-
// Web API 配置和服务
-
// 将 Web API 配置为仅使用不记名令牌身份验证。
-
config.SuppressDefaultHostAuthentication();
-
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
-
-
// Web API 路由
-
config.MapHttpAttributeRoutes(); //此句为关键
-
-
config.Routes.MapHttpRoute(
-
name: "DefaultApi",
-
routeTemplate: "api/{controller}/{id}",
-
defaults: new { id = RouteParameter.Optional}
-
);
-
}
-
}
通过HTTP METHOD和Route属性一起使用
-
[Route("api/books")]
-
[HttpPost]
-
public HttpResponseMessage CreateBook(Book book) { ... }
路由前缀Attribute,用于简化公共部分
-
[RoutePrefix("api/books")]
-
public class BooksController : ApiController
-
{
-
// GET api/books
-
[Route("")]
-
public IEnumerable<Book> Get() { ... }
-
-
// GET api/books/5
-
[Route("{id:int}")]
-
public Book Get(int id) { ... }
-
-
// POST api/books
-
[Route("")]
-
public HttpResponseMessage Post(Book book) { ... }
-
}
参数约束
-
[Route("users/{id:int:min(1)}")]
-
public User GetUserById(int id) { ... }
可选参数
-
public class BooksController : ApiController
-
{
-
[Route("api/books/locale/{lcid:int?}")]
-
//[Route("api/books/locale/{lcid:int=1033}")]
-
public IEnumerable<Book> GetBooksByLocale(int lcid = 1033) { ... }
-
}
为路由指定一个名称
[Route("api/books/{id}", Name="GetBookById")]
// Generate a link to the new book and set the Location header in the response.
string uri = Url.Link("GetBookById", new { id = book.BookId });