ASP.NET Core 3.x - Endpoint Routing 路由体系的内部机制
Endpoint是什么?
Endpoint簡(jiǎn)單的可以理解為這樣的一些類,它們包含一個(gè)請(qǐng)求的委托(Request Delegate)和其它的一些元數(shù)據(jù),使用這些東西,Endpoint類可以生成一個(gè)響應(yīng)。
而在MVC的上下文中,這個(gè)請(qǐng)求委托就是一個(gè)包裝類,它包裝了一個(gè)方法,這個(gè)方法可以實(shí)例化一個(gè)Controller并執(zhí)行選中的Action方法。
Endpoint還包含元數(shù)據(jù),這些元數(shù)據(jù)用來(lái)決定他們的請(qǐng)求委托是否應(yīng)該用于當(dāng)前的請(qǐng)求,還是另有其它用途。
說(shuō)起來(lái)可能有點(diǎn)迷糊,下一篇文章我們看看源碼。
?
Startup.cs
之前我們見(jiàn)過(guò),ASP.NET Core里面的Startup.cs里面有兩個(gè)方法,分別是ConfigureServices()和Configure(),它們的職責(zé)就是注冊(cè)應(yīng)用的一些服務(wù)和構(gòu)建中間件請(qǐng)求管道。
而Startup.cs同時(shí)也是路由以及Endpoint進(jìn)行注冊(cè)的地方,當(dāng)然是作為其它步驟的一部分。
看圖:
在ASP.NET Core應(yīng)用程序啟動(dòng)的時(shí)候,一個(gè)叫做ControllerActionEndpointDataSource的類作為應(yīng)用程序級(jí)別的服務(wù)被創(chuàng)建了。
這個(gè)類里面有一個(gè)叫做CreateEndpoints()的方法,它會(huì)獲取所有Controller的Action方法。
然后針對(duì)每個(gè)Action方法,它會(huì)創(chuàng)建一個(gè)Endpoint實(shí)例。這些Endpoint的實(shí)例就是包裝了Controller和Action方法執(zhí)行的請(qǐng)求委托(Request Delegate)。
同時(shí)ControllerActionEndpointDataSource里面包存儲(chǔ)著在應(yīng)用程序里注冊(cè)的路由模板。
而針對(duì)每個(gè)Endpoint,它要么與某個(gè)按約定的路由模板相關(guān)聯(lián),要么與某個(gè)Controller Action上的Attribute路由信息相關(guān)聯(lián)。而這些路由在稍后就會(huì)被用來(lái)將Endpoint與進(jìn)來(lái)的請(qǐng)求進(jìn)行匹配。
?
從Endpoint的角度查看請(qǐng)求-響應(yīng)流程圖
App啟動(dòng)那部分就不說(shuō)了。
第一個(gè)HTTP請(qǐng)求進(jìn)來(lái)的時(shí)候,Endpoint Routing中間件就會(huì)把請(qǐng)求映射到一個(gè)Endpoint上。它會(huì)使用App啟動(dòng)時(shí)創(chuàng)建好的EndpointDataSource,用它來(lái)遍歷查找所有可用的Endpoint,并檢查和它關(guān)聯(lián)的路由以及元數(shù)據(jù),以便找到最匹配的Endpoint。
一旦某個(gè)Endpoint實(shí)例被選中,它就會(huì)被附加在請(qǐng)求的對(duì)象上,這樣它就可以被后續(xù)的中間件所使用了。
最后在管道的盡頭,當(dāng) Endpoint中間件運(yùn)行的時(shí)候,它就會(huì)執(zhí)行Endpoint所關(guān)聯(lián)的請(qǐng)求委托。這個(gè)請(qǐng)求委托就會(huì)觸發(fā)和實(shí)例化選中的Controller和Action方法,并產(chǎn)生響應(yīng)。最后響應(yīng)再?gòu)闹虚g件管道原路返回。
總結(jié)
以上是生活随笔為你收集整理的ASP.NET Core 3.x - Endpoint Routing 路由体系的内部机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 企业数字化转型解决方案
- 下一篇: .Net微服务实战之技术选型篇