?
asp.net請(qǐng)求響應(yīng)模型原理隨記回顧:
根據(jù)一崇敬的講師總結(jié):(會(huì)存在些錯(cuò)誤,大家可以做參考)
1.-當(dāng)在瀏覽器輸入url后,客戶端會(huì)將請(qǐng)求根據(jù)http協(xié)議封裝成為http請(qǐng)求報(bào)文。并通過(guò)主socket創(chuàng)建新的socket對(duì)象傳輸請(qǐng)求報(bào)文。(請(qǐng)求服務(wù)器端的端口為80端口)
2.當(dāng)socket到達(dá)80端口后,這時(shí)監(jiān)聽80端口的socket會(huì)創(chuàng)建新的socket代理來(lái),開辟新的socket端口,進(jìn)行通信,請(qǐng)求報(bào)文信息會(huì)被操作系統(tǒng)的內(nèi)核模式kernalModel的http.sys(驅(qū)動(dòng)級(jí)別)進(jìn)行解析并負(fù)責(zé)將請(qǐng)求分發(fā)具體的處理程序。(http.sys其實(shí)可以看做是插件模型,即管道模型,通過(guò)系統(tǒng)注冊(cè)表向這個(gè)管道注冊(cè)處理程序,這樣請(qǐng)求信息就會(huì)被注冊(cè)處理程序截獲過(guò)濾執(zhí)行)。
3.http.sys解析出請(qǐng)求時(shí)80端口并根據(jù)注冊(cè)表找到對(duì)應(yīng)處理程序,之后交給了寄宿在svchost.exe中的w3svc服務(wù),它會(huì)判斷請(qǐng)求文件的后綴,如果是靜態(tài)頁(yè),js等靜態(tài)資源,便直接在iis內(nèi)部處理再通過(guò)通信端口返回響應(yīng)信息。如果是.aspx,就會(huì)找到相應(yīng)的處理程序(可以看出iis也是插件模型)即aspnet_isapi.dll(非托管用c++寫的)。
4. aspnet_isapi.dll會(huì)通過(guò)ecb操作系統(tǒng)句柄(標(biāo)志系統(tǒng)一些資源)這樣托管環(huán)境就能訪問(wèn)報(bào)文信息(可以看出aspnet_isapi.dll是托管和非托管環(huán)境的一個(gè)橋梁);之后傳給isapiruntime,通過(guò)ecb指針創(chuàng)建一個(gè)httpworkrequest對(duì)象(對(duì)http報(bào)文做最初的封裝處理)之后再交給httpruntime對(duì)象,它會(huì)對(duì)httpworkrequest對(duì)象做進(jìn)一步封裝,通過(guò)創(chuàng)建httpcontext,將httpworkrequest封裝到httpcontext的httprequest對(duì)象中(返回的相應(yīng)報(bào)文會(huì)封裝到httpcontext的httpresponse中)。
5.之后HttpApplicationFactory創(chuàng)建一個(gè)HttpApplication管道(這里使用了對(duì)象池,因?yàn)镠ttpApplication通過(guò)反射創(chuàng)建好資源,如果對(duì)象池中有的話,直接取出來(lái),和線程池,應(yīng)用程序池,一般處理程序池都是一樣的,httpapplication管道當(dāng)然也是插件模型了,通過(guò)httpModule注冊(cè)事件),這時(shí)httpcontext會(huì)流經(jīng)這個(gè)管道,注冊(cè)的處理程序便可以截獲過(guò)濾httpcontext了。(httpallication共有23個(gè)事件,19個(gè)事件可以讓開發(fā)者使用,-httpapplication的第7個(gè)事件獲得緩存,8事件:創(chuàng)建最終處理當(dāng)前請(qǐng)求的handler實(shí)例;在11和12個(gè)事件之間會(huì)調(diào)用執(zhí)行一般處理程序(handler的pr方法處理請(qǐng)求);)
?
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
