ASP.NET Core 2.1 : 图解路由(2.1 or earler)
本文通過一張圖來看一下路由的配置以及請求處理的機制。?
一、概述
路由主要有兩個主要功能:
將請求的URL與已定義的路由進行匹配,找到該URL對應的處理程序并傳入該請求進行處理。
根據已定義的路由生成URL
這兩個功能看起來這兩個是相反的。
A.路由的配置
路由的兩個功能都離不開一個基本的操作:路由的基本配置。在Startup中默認通過?routes.MapRoute(name: "default",template: "{controller=Home}/{action=Index}/{id?}")定義,
當然我們還可以繼續?routes.MapRoute(。。。);? 這樣就定義了一系列的路由匹配方式組成一個路由表,例如這樣:
每一個MapRoute會生成一個Route,第二個MapRoute看起來有些特殊,我們可以傳入一個自定義的RequestDelegate(本例為MyRouteHandler.Handler)來處理“flylolo/{code}/{name}”這樣的請求,
它會被封裝成一個RouteHandler(new RouteHandler(MyRouteHandler.Handler))賦值給Route的target屬性,而對于另外兩種沒有指定的,Route的target屬性默認會被指定為MvcRouteHandler?,如下圖:
B.Handler的選擇
當請求進入之后,根據此路由表對該URL進行逐一匹配,并將請求交給匹配到的路由的target(即MvcRouteHandler或RouteHandler),調用?<span class="cnblogs_code" style="margin-top: 5px;margin-bottom: 5px;padding: 3px;background-color: rgb(245, 245, 245);border-width: 1px;border-style: solid;border-color: rgb(204, 204, 204);overflow: auto;color: rgb(0, 0, 0);font-family: " !important;"="" courier="" 12px="">_target.RouteAsync(context);?,在這個方法中,若是MvcRouteHandler會對請求的Controller和Action驗證,若驗證成功,則對context(是一個RouteContext)的Handler屬性賦值一個匿名方法;若是RouteHandler則會直接將其封裝的RequestDelegate(本例為MyRouteHandler.Handler)賦值給RouteContext.Handler.
C.請求處理
經過Handler的選擇后,若RouteContext.Handler不為空,則調用RouteContext.Handler(HttpContext)對請求進行處理。
D.其他
回想一下中間件,這個是不是和app.Map("/test", XXHandle)這樣配置中間件的方式有點像,當請求路徑是/test的時候,請求交由XXHandle處理,同樣是Map,對比著更容易理解。
下面通過一張圖看一下路由配置和請求處理的流程。
二、流程及解析
?
? 為了方便查看,對幾個“重點對象”做了顏色標識(點擊圖片可以看大圖):
?
路由的初始化配置
一切從Startup開始,之前在中間件的文章中介紹過,一般是通過多個UseXXX的方式將多個中間件組成“請求處理管道”,而在這里通過UseMvc方法進行配置,傳入routes.MapRoute(...)這樣的一個或多個配置。
接下來會New一個
RouteBuilder
,顧名思義就是一個Route的創建者,通過調用傳進來的一個或多個routes.MapRoute()方法生成多個Route,并配置默認的Handler。
①調用RouteBuilder的Build方法,生成一個RouteCollection。
②RouteCollection實現IRouteCollection和IRouter接口,他是在Startup中的配置組成的集合。
③RouterMiddleWare就是專門用于進行路由處理的中間件,在此將RouteCollection作為中間件RouterMiddleWare的參數,并將這個中間件插入管道中。
2.?請求處理流程
? ? ? ④請求的處理流程在RouterMiddleWare的invoke()方法中。
? ?⑤請求首先會被封裝成一個RouteContext,本質就是將httpContext、_router(也就是RouteCollection)包裝到一個對象里。
?⑥調用_router(也就是RouteCollection)的RouteAsync(context)方法,在其中遍歷每一個路由
?⑦若與請求URL匹配,則將對應的Handler賦值給context.Handler。
?⑧在RouterMiddleWare的invoke()方法中,調用新賦值的context.Handler處理HttpContext;
三、其他
? ? ? 由于文章寫的比較早各種原因一直沒有寫完,現在發現2.2版本之后,啟用了新的路由方案,還是把這章完成了發出來,有愿意看的可以參考一下,下一篇文章介紹一下2.2版的新的路由方案,至于通過路由生成URL部分,就暫時不寫了。
https://www.cnblogs.com/FlyLolo/p/ASPNETCore2_15.html
原文地址:https://www.cnblogs.com/FlyLolo/p/ASPNETCore2_15.html
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結
以上是生活随笔為你收集整理的ASP.NET Core 2.1 : 图解路由(2.1 or earler)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: asp.net core 环境(Dev
- 下一篇: ML.NET 0.9特性简介