以下為常規MVC路由
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屬性路由實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!