一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - 詳解ASP.NET WEB API 之屬性路由

詳解ASP.NET WEB API 之屬性路由

2020-04-28 12:27三只倉鼠 ASP.NET教程

本篇文章主要介紹了ASP.NET WEB API 之屬性路由,路由就是Web API如何把URI匹配到一個Action的描述。有興趣的可以了解一下。

以下為常規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錯誤。)

詳解ASP.NET WEB API 之屬性路由

通常情況下,在同一個控制器中的所有路由以相同的前綴開頭

?
1
2
3
[Route("api/books")]
[Route("api/books/{id:int}")]
[Route("api/books")]

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

詳解ASP.NET WEB API 之屬性路由

測試結果

詳解ASP.NET WEB API 之屬性路由

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

詳解ASP.NET WEB API 之屬性路由

測試結果(同一個類下)

詳解ASP.NET WEB API 之屬性路由

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

詳解ASP.NET WEB API 之屬性路由

測試結果

詳解ASP.NET WEB API 之屬性路由

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

詳解ASP.NET WEB API 之屬性路由

測試結果

詳解ASP.NET WEB API 之屬性路由

如果參數不是Int類型,則不會匹配到該路由

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

詳解ASP.NET WEB API 之屬性路由

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

?
1
2
[Route("users/{id:int:length(1,3)}")]
public User GetUserById(int id) { ... }

結果

詳解ASP.NET WEB API 之屬性路由

如果不在范圍內的話則匹配不到

詳解ASP.NET WEB API 之屬性路由

自定義路由約束,需要實現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) { ... }
}

差不多寫這么多常用的,剩余部分自己查看官網!希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://www.jianshu.com/p/4430cbc57a26#

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: hd在线观看免费高清视频 | 手机av | h视频免费高清在线观看 | 人人爽人人香蕉 | 国产精品66福利在线观看 | 免费观看大片毛片 | 91香蕉小视频 | 日本mv精品中文字幕 | 国产高清视频在线 | 日韩 国产 欧美 精品 在线 | 天堂网www在线观看 天堂欧美 | 91精品国产高清久久久久久 | 西西人体大胆77777视频 | 99精品视频在线观看 | 国产一区二区免费不卡在线播放 | 午夜免费啪视频观看视频 | 免费观看一级特黄三大片视频 | 好妈妈7在线观看高清 | 国产成人免费观看在线视频 | 超强台风免费观看完整版视频 | 青春草在线观看精品免费视频 | www.av在线视频| 999导航| 91久久精品国产亚洲 | 亚州男人的天堂 | 免费被靠视频动漫 | 欧美激烈精交gif动态图18p | 欧美精品一区二区在线观看播放 | 欧美人做人爱a全程免费 | 女人爽到喷水的视频免费看 | 男人操女人动图 | 超兴奋朋友的中文字幕下 | 久久艹综合 | 天堂8在线天堂资源在线 | 久久青草费线频观看国产 | 亚洲成在人网站天堂一区二区 | 国产高清专区 | 鬼畜重口高h合集长短篇 | 免费特黄一级欧美大片 | 青青青国产精品国产精品久久久久 | 放荡警察巨r麻麻出轨小说 范冰冰特黄xx大片 饭冈加奈子在线播放观看 法国老妇性xx在线播放 |