WEB API的 ASP.NET屬性路由執行個體詳解

來源:互聯網
上載者:User
以下為常規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) { ... }}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.