首頁 > 後端開發 > C#.Net教程 > WEB API的 ASP.NET屬性路由實例詳解

WEB API的 ASP.NET屬性路由實例詳解

Y2J
發布: 2017-04-25 15:49:22
原創
2291 人瀏覽過

以下為常規MVC路由

1

2

3

4

5

config.Routes.MapHttpRoute(

       name: "DefaultApi",

       routeTemplate: "api/{controller}/{id}",

       defaults: new { id = RouteParameter.Optional },

     );

登入後複製

如果我們要實現類似以下效果路由的話,使用常規公約路由比較麻煩。

1

2

order/Miles/三只松鼠干果/2袋

order/2017/1/13

登入後複製

如果使用屬性路由的話就比較簡單了。

新WEB API專案的話,開啟App_Start目錄下的WebApiConfig.cs檔案新增以下程式碼開啟屬性路由設定。

1

config.MapHttpAttributeRoutes();

登入後複製

屬性路由也可以和公約路由混合使用,如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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+"}

     );

   }

登入後複製

在要使用屬性路由的方法上打上特性標記,如下:

1

[Route("order/{UserNickName}/{ProductName}/{count}")]

登入後複製

測試結果( URL經過了編碼,不然會報400錯誤。 #

1

2

3

[Route("api/books")]

[Route("api/books/{id:int}")]

[Route("api/books")]

登入後複製

這樣很明顯是比較麻煩的。所以我們用[RoutePrefix]屬性來設定一個公共的前綴


#測試結果

如果使用了[RoutePrefix ]的話,某些比較特殊的api,我們可以使用波浪線來重寫路由前綴,如下:

測試結果(同一個類別下)

路由前綴中也可以包含參數,如下

#測試結果

可以在路由中加入參數約束,如下


測試結果

##如果參數不是Int類型,則不會符合到該路由

以下都是一些會被支援到的約束

可以使用多個約束,但是要用冒號分開

1

2

[Route("users/{id:int:length(1,3)}")]

public User GetUserById(int id) { ... }

登入後複製

結果

如果不在範圍內的話則符合不到

自訂路由約束,需要實作IHttpRouteConstraint接口,具體查看官方

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

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;

  }

}

登入後複製

註冊約束

1

2

3

4

5

6

7

8

9

10

public static class WebApiConfig

{

  public static void Register(HttpConfiguration config)

  {

    var constraintResolver = new DefaultInlineConstraintResolver();

    constraintResolver.ConstraintMap.Add("nonzero", typeof(NonZeroConstraint));

 

    config.MapHttpAttributeRoutes(constraintResolver);

  }

}

登入後複製

使用約束

1

2

[Route("{id:nonzero}")]

public HttpResponseMessage GetNonZero(int id) { ... }

登入後複製
可選的URI參數和預設值

你可以透過加入一個問號標記路由參數使成為一個可選的URI參數。如果一個路由參數是可選的,你必須為這個方法參數定義一個預設值。

1

2

3

4

5

public class BooksController : ApiController

{

  [Route("api/books/locale/{lcid:int?}")]

  public IEnumerable<Book> GetBooksByLocale(int lcid = 1033) { ... }

}

登入後複製

或在路由模版中定義預設值

1

2

3

4

5

public class BooksController : ApiController

{

  [Route("api/books/locale/{lcid=1033}")]

  public IEnumerable<Book> GetBooksByLocale(int lcid) { ... }

}

登入後複製

以上是WEB API的 ASP.NET屬性路由實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
app部署時為什麼首選app高防伺服器
來自於 1970-01-01 08:00:00
0
0
0
java - springboot新手學習
來自於 1970-01-01 08:00:00
0
0
0
spring - JavaWeb中 Service 層的事務問題
來自於 1970-01-01 08:00:00
0
0
0
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板