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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

ASP.NET Core 2.1 : 图解路由(2.1 or earler)

發(fā)布時(shí)間:2023/12/4 asp.net 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET Core 2.1 : 图解路由(2.1 or earler) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文通過一張圖來看一下路由的配置以及請(qǐng)求處理的機(jī)制。?

一、概述

路由主要有兩個(gè)主要功能:

  • 將請(qǐng)求的URL與已定義的路由進(jìn)行匹配,找到該URL對(duì)應(yīng)的處理程序并傳入該請(qǐng)求進(jìn)行處理。

  • 根據(jù)已定義的路由生成URL

  • 這兩個(gè)功能看起來這兩個(gè)是相反的。

    A.路由的配置

    路由的兩個(gè)功能都離不開一個(gè)基本的操作:路由的基本配置。在Startup中默認(rèn)通過?routes.MapRoute(name: "default",template: "{controller=Home}/{action=Index}/{id?}")定義,

    當(dāng)然我們還可以繼續(xù)?routes.MapRoute(。。。);? 這樣就定義了一系列的路由匹配方式組成一個(gè)路由表,例如這樣:

    每一個(gè)MapRoute會(huì)生成一個(gè)Route,第二個(gè)MapRoute看起來有些特殊,我們可以傳入一個(gè)自定義的RequestDelegate(本例為MyRouteHandler.Handler)來處理“flylolo/{code}/{name}”這樣的請(qǐng)求,

    它會(huì)被封裝成一個(gè)RouteHandler(new RouteHandler(MyRouteHandler.Handler))賦值給Route的target屬性,而對(duì)于另外兩種沒有指定的,Route的target屬性默認(rèn)會(huì)被指定為MvcRouteHandler?,如下圖:

    B.Handler的選擇

    當(dāng)請(qǐng)求進(jìn)入之后,根據(jù)此路由表對(duì)該URL進(jìn)行逐一匹配,并將請(qǐng)求交給匹配到的路由的target(即MvcRouteHandler或RouteHandler),調(diào)用?<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);?,在這個(gè)方法中,若是MvcRouteHandler會(huì)對(duì)請(qǐng)求的Controller和Action驗(yàn)證,若驗(yàn)證成功,則對(duì)context(是一個(gè)RouteContext)的Handler屬性賦值一個(gè)匿名方法;若是RouteHandler則會(huì)直接將其封裝的RequestDelegate(本例為MyRouteHandler.Handler)賦值給RouteContext.Handler.

    C.請(qǐng)求處理

    經(jīng)過Handler的選擇后,若RouteContext.Handler不為空,則調(diào)用RouteContext.Handler(HttpContext)對(duì)請(qǐng)求進(jìn)行處理。

    D.其他

    回想一下中間件,這個(gè)是不是和app.Map("/test", XXHandle)這樣配置中間件的方式有點(diǎn)像,當(dāng)請(qǐng)求路徑是/test的時(shí)候,請(qǐng)求交由XXHandle處理,同樣是Map,對(duì)比著更容易理解。

    下面通過一張圖看一下路由配置和請(qǐng)求處理的流程。

    二、流程及解析

    ?

    ? 為了方便查看,對(duì)幾個(gè)“重點(diǎn)對(duì)象”做了顏色標(biāo)識(shí)(點(diǎn)擊圖片可以看大圖):

    ?

  • 路由的初始化配置

  • 一切從Startup開始,之前在中間件的文章中介紹過,一般是通過多個(gè)UseXXX的方式將多個(gè)中間件組成“請(qǐng)求處理管道”,而在這里通過UseMvc方法進(jìn)行配置,傳入routes.MapRoute(...)這樣的一個(gè)或多個(gè)配置。

  • 接下來會(huì)New一個(gè)

  • RouteBuilder

  • ,顧名思義就是一個(gè)Route的創(chuàng)建者,通過調(diào)用傳進(jìn)來的一個(gè)或多個(gè)routes.MapRoute()方法生成多個(gè)Route,并配置默認(rèn)的Handler。

  • ①調(diào)用RouteBuilder的Build方法,生成一個(gè)RouteCollection。

    RouteCollection實(shí)現(xiàn)IRouteCollection和IRouter接口,他是在Startup中的配置組成的集合。

    RouterMiddleWare就是專門用于進(jìn)行路由處理的中間件,在此將RouteCollection作為中間件RouterMiddleWare的參數(shù),并將這個(gè)中間件插入管道中。

    2.?請(qǐng)求處理流程

      ? ? ? ④請(qǐng)求的處理流程在RouterMiddleWare的invoke()方法中。

       ? ?⑤請(qǐng)求首先會(huì)被封裝成一個(gè)RouteContext,本質(zhì)就是將httpContext、_router(也就是RouteCollection)包裝到一個(gè)對(duì)象里。

    ?⑥調(diào)用_router(也就是RouteCollection)的RouteAsync(context)方法,在其中遍歷每一個(gè)路由

    ?⑦若與請(qǐng)求URL匹配,則將對(duì)應(yīng)的Handler賦值給context.Handler。

    ?⑧在RouterMiddleWare的invoke()方法中,調(diào)用新賦值的context.Handler處理HttpContext;

    三、其他

    ? ? ? 由于文章寫的比較早各種原因一直沒有寫完,現(xiàn)在發(fā)現(xiàn)2.2版本之后,啟用了新的路由方案,還是把這章完成了發(fā)出來,有愿意看的可以參考一下,下一篇文章介紹一下2.2版的新的路由方案,至于通過路由生成URL部分,就暫時(shí)不寫了。

    https://www.cnblogs.com/FlyLolo/p/ASPNETCore2_15.html


    原文地址:https://www.cnblogs.com/FlyLolo/p/ASPNETCore2_15.html


    .NET社區(qū)新聞,深度好文,歡迎訪問公眾號(hào)文章匯總 http://www.csharpkit.com


    創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

    總結(jié)

    以上是生活随笔為你收集整理的ASP.NET Core 2.1 : 图解路由(2.1 or earler)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。