日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

跟我一起学.NetCore之路由的最佳实现

發布時間:2023/12/4 asp.net 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 跟我一起学.NetCore之路由的最佳实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

路由,這詞絕對不陌生,不管在前端還是后端都經常提到,而這節不說其他,就聊.NetCore的路由;在之前的Asp.Net MVC 中,路由算是面試時必問的考點,可見其重要性,它的主要作用是映射URL,而不需要關注服務器的物理文件結構,提高安全性,同時規范了URL請求,有利于搜索引擎優化;所以在Asp.NetCore中當然也不能缺少,以下說說其應用。

正文

在Asp.NetCore中,注冊路由方式有兩種:

  • 模板路由注冊:適合應用于MVC頁面項目,相對于來說,使用模板的形式更加方便,約定大于配置,統一URL;

  • 特性路由注冊(RouteAttribute):適合應用于API項目,針對于不同業務路由會進行定制,特性標注顯得更加便捷;

少說話,多擼碼,這里就創建一個WebAPI項目來進行演示:

默認情況下,創建的WebAPI項目是推薦使用特性路由方式進行注冊(MVC默認是使用路由模板方式),當然也可以在Api項目中進行使用模板路由方式注冊,如下:

當注釋掉特性路由,在注冊終結點時增加路由模板,最終運行時會出現異常,因為用ApiController標識的Controller必須是特性路由,那把ApiController特性也注釋掉,結果就正常運行了,如下:

這里其實有一個重要的知識點:路由匹配規則,考慮到小伙伴們之前使用Asp.Net MVC時就用到,先默認小伙伴們了解這塊知識(抽時間單獨整理一篇出來);以下內容著重說說特性路由應用和路由約束這塊,因為有關注到接觸的項目中不管是之前的Asp.Net,?還是現在的Asp.NetCore項目,幾乎沒有看到路由約束的應用,而在很多場景,路由約束很有必要,用于消除路由的歧義。

特性路由應用

直接在Action上加Route 特性,如下:

運行結果如下:

通常為了避免在每個Action中的重復的指定路徑前綴,可以將公共部分提取到Controller類上進行Route標識,如下:

統一前綴之后,運行結果:

以上的方式都是將路徑寫成固定的字符串,有時候會要求像模板路由中那樣動態替換指定標記([area],[controller],[action] ),通常項目中會如下使用:

以上只是簡單說說特性路由的用法,小伙伴們可以根據實際情況進行標注,當然如果有特殊需求,也可以進行自定義路由特性,只要繼承IRouteTemplateProvider接口即可,上面標注的Route和HttpGet特性也是繼承于這個接口,把RouteAtrribute的源代碼扒出來參考參考:

namespace Microsoft.AspNetCore.Mvc {//?標識此特性只能在類和方法上使用[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]public class RouteAttribute : Attribute, IRouteTemplateProvider{private int? _order;//?構造函數,傳入一個Url模板參數public RouteAttribute(string template){Template = template ?? throw new ArgumentNullException(nameof(template));}public string Template { get; }// 路由執行順序,默認為0public int Order{get { return _order ?? 0; }set { _order = value; }}/// <inheritdoc />int? IRouteTemplateProvider.Order => _order;//?路由名稱,后續可以根據路由名稱生成Url,而不是硬編碼編寫public string Name { get; set; }} }

來,自己也搞一個特性路由練練:

有沒有很簡單,其實這里是忍住沒去扒代碼的,后續單獨去扒;用法就先暫時說這么多,接下來說說路由傳參和約束。

路由傳參和約束

一般情況,會針對路由中動態參數進行約束;從而路由約束可能會被作為輸入校驗,但是官方不推薦,因為當規則不匹配的時候,返回狀態404(找不到),而事實對應地址可以到達請求,只是參數輸入不合法而已,所以官方推薦作為消除路由歧義?,同時也能避免不規則的路由進行業務處理;直接來案例演示(廢話多了怕掉坑里):

新增的Controller完整代碼:

namespace RouteDemo.Controllers {[ApiController][Route("/api/[controller]")]public class TestConstraintController{/// <summary>/// 驗證必須輸入,沒有輸入就返回404/// </summary>[HttpGet("TestRequiredConstraint/{name:required}")]public string TestRequiredConstraint(string name){return "TestRequiredConstraint";}/// <summary>/// 整型約束,非整型數據就返回404/// </summary>[HttpGet("TestValueConstraint/{id:int}")]public string TestValueConstraint(int id){return "TestValueConstraint";}/// <summary>/// 傳入最小值為100,傳入值小于100就返回404/// </summary>[HttpGet("TestMinConstraint/{id:min(100)}")]public string TestMinConstraint(int id){return "TestMinConstraint";}/// <summary>/// 范圍約束8到18,不在這個范圍內就返回404/// </summary>[HttpGet("TestRangeConstraint/{id:range(8,18)}")]public string TestRangeConstraint(int id){return "TestRangConstraint";}/// <summary>/// 驗證最小長度為5,低于這個長度就返回404/// </summary>[HttpGet("TestMinLengthConstraint/{name:minLength(5)}")]public string TestMinLengthConstraint(string name){return "TestMinLengthConstraint";}?/// <summary>/// 正則表達式約束,以三個數字開頭,不滿足就返回404/// </summary>[HttpGet("TestRegexConstraint/{msg:regex(^\\d{{3}})}")]public string TestRegexConstraint(string msg){return "TestRegexConstraint";}/// <summary>/// 整型約束,范圍約束8到18,不在這個范圍內就返回404/// </summary>[HttpGet("TestMultiConstraint/{id:int:range(8,18)}")]public string TestMultiConstraint(int id){return "TestRangConstraint";}} }

以上只是挑了幾個默認內置的約束進行舉例演示,其實還有很多,剩下的小伙伴下來一定要試試,用法都很簡單,如下:

  • 單個約束時

    參數:約束

    案例:[HttpGet("TestRequiredConstraint/{name:required}")]

  • 多個約束時

    參數:約束1:約束2:....

    案例:[HttpGet("TestMultiConstraint/{id:int:range(8,18)}")]

框架本身內置的約束,如下(小伙伴一定要敲敲):

約束示例說明
int{id:int}匹配任何整數
bool{active:bool}匹配?true?或?false。?不區分大小寫
datetime{dob:datetime}在固定區域性中匹配有效的?DateTime?值。?
decimal{price:decimal}在固定區域性中匹配有效的?decimal?值。
double{weight:double}在固定區域性中匹配有效的?double?值。?
float{weight:float}在固定區域性中匹配有效的?float?值。?
guid{id:guid}匹配有效的?Guid?值
long{ticks:long}匹配有效的?long?值
minlength(value){username:minlength(4)}字符串必須至少為 4 個字符
maxlength(value){filename:maxlength(8)}字符串不得超過 8 個字符
length(length){filename:length(12)}字符串必須正好為 12 個字符
length(min,max){filename:length(8,16)}字符串必須至少為 8 個字符,且不得超過 16 個字符
min(value){age:min(18)}整數值必須至少為 18
max(value){age:max(120)}整數值不得超過 120
range(min,max){age:range(18,120)}整數值必須至少為 18,且不得超過 120
alpha{name:alpha}字符串必須由一個或多個字母字符組成,a-z,并區分大小寫。
regex(expression){ssn:regex(^\\d{{3}}-\\d{{2}}-\\d{{4}}$)}字符串必須與正則表達式匹配。?請參閱有關定義正則表達式的提示。
required{name:required}用于強制在 URL 生成過程中存在非參數值

不用說,內置約束肯定不可能面面俱到,所以針對個性化約束,還需要自定義,繼承?IRouteConstraint 接口便可實現自定義路由約束。?接口中包含 Match,當滿足約束時,它返回?true,否則返回?false。如下例演示:

總結

特性路由和約束就說到這吧,根據實際需求進行路由約束,但不能盲目,如果是要進行輸入數據校驗,請考慮使用模型驗證!下一節說說集成Swagger。

一個被程序搞丑的帥小伙,關注"Code綜藝圈",識別關注跟我一起學~~~

擼文不易,莫要白瞟,三連走起~~~~

總結

以上是生活随笔為你收集整理的跟我一起学.NetCore之路由的最佳实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。