config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional }, );
假如我们要完成相似以下效果路由的话,运用通例条约路由比较贫苦。
order/Miles/三只松鼠干果/2袋 order/2017/1/13
假如运用属性路由的话就比较简单了。
新建WEB API项目的话,翻开App_Start目录下的WebApiConfig.cs文件增加以下代码开启属性路由设置。
config.MapHttpAttributeRoutes();
属性路由也能够和条约路由夹杂运用,以下:
public static void Register(HttpConfiguration config) { // Web API 设置和效劳 // Web API 路由 config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional }, constraints: new { id=@"\d+"} ); }
在要运用属性路由的要领上打上特征标记,以下 :
[Route("order/{UserNickName}/{ProductName}/{count}")]
测试效果(URL经过了编码,不然会报400毛病。)
通常情况下,在同一个控制器中的一切路由以雷同的前缀开首
[Route("api/books")] [Route("api/books/{id:int}")] [Route("api/books")]
如许很明显是比较贫苦的。所以我们用[RoutePrefix]属性来设置一个大众的前缀
测试效果
假如运用了[RoutePrefix]的话,某些比较特别的api,我们能够运用波浪线来重写路由前缀,以下:
测试效果(同一个类下)
路由前缀中也能够包括参数,以下
测试效果
能够在路由中增加参数束缚,以下
测试效果
假如参数不是Int范例,则不会婚配到该路由
以下都是一些会被支撑到的束缚
能够运用多个束缚,然则要用冒号离开
[Route("users/{id:int:length(1,3)}")] public User GetUserById(int id) { ... }
效果
假如不在范围内的话则婚配不到
自定义路由束缚,须要完成IHttpRouteConstraint接口,细致检察官方
public class NonZeroConstraint : IHttpRouteConstraint { public bool Match(HttpRequestMessage request, IHttpRoute route, string parameterName, IDictionary<string, object> values, HttpRouteDirection routeDirection) { object value; if (values.TryGetValue(parameterName, out value) && value != null) { long longValue; if (value is long) { longValue = (long)value; return longValue != 0; } string valueString = Convert.ToString(value, CultureInfo.InvariantCulture); if (Int64.TryParse(valueString, NumberStyles.Integer, CultureInfo.InvariantCulture, out longValue)) { return longValue != 0; } } return false; } }
注册束缚
public static class WebApiConfig { public static void Register(HttpConfiguration config) { var constraintResolver = new DefaultInlineConstraintResolver(); constraintResolver.ConstraintMap.Add("nonzero", typeof(NonZeroConstraint)); config.MapHttpAttributeRoutes(constraintResolver); } }
运用束缚
[Route("{id:nonzero}")] public HttpResponseMessage GetNonZero(int id) { ... }
可选的URI参数和默认值
你能够经由过程增加一个问号标记路由参数使成为一个可选的URI参数。假如一个路由参数是可选的,你必需为这个要领参数定义一个默认值。
public class BooksController : ApiController { [Route("api/books/locale/{lcid:int?}")] public IEnumerable<Book> GetBooksByLocale(int lcid = 1033) { ... } }
或许在路由模版中定义默认值
public class BooksController : ApiController { [Route("api/books/locale/{lcid=1033}")] public IEnumerable<Book> GetBooksByLocale(int lcid) { ... } }
以上就是WEB API的 ASP.NET属性路由实例详解的细致内容,更多请关注ki4网别的相干文章!