ASP.Net 請(qǐng)求響應(yīng)流程簡(jiǎn)述
一、瀏覽器請(qǐng)求頁(yè)面的簡(jiǎn)單流程
當(dāng)瀏覽器請(qǐng)求靜態(tài)頁(yè)面時(shí),會(huì)發(fā)送請(qǐng)求給服務(wù)器軟件,服務(wù)器軟件直接去找對(duì)應(yīng)的靜態(tài)頁(yè)面,并返回給瀏覽器。
當(dāng)瀏覽器請(qǐng)求動(dòng)態(tài)頁(yè)面時(shí),服務(wù)器軟件收到請(qǐng)求,發(fā)現(xiàn)處理不了.aspx文件,就去映射表當(dāng)中根據(jù)后綴名找對(duì)應(yīng)的處理程序(aspnet_isapi.dll),這個(gè)處理程序?qū)崿F(xiàn)了服務(wù)器軟件提供的接口,即服務(wù)器軟件通過(guò)接口調(diào)用了這個(gè)處理程序當(dāng)中的方法。aspnet_isapi.dll會(huì)將請(qǐng)求轉(zhuǎn)交給.Net Framework,由它處理動(dòng)態(tài)頁(yè)面,創(chuàng)建頁(yè)面對(duì)象,生成相應(yīng)報(bào)文,響應(yīng)給瀏覽器。
當(dāng)服務(wù)器接收到瀏覽器的動(dòng)態(tài)頁(yè)面請(qǐng)求時(shí),去網(wǎng)站的程序集中找對(duì)應(yīng)的類,通過(guò)反射的方式創(chuàng)建類的對(duì)象,并運(yùn)行ProcessRequest方法處理用戶的需求,最后通過(guò)Write方法輸出響應(yīng)數(shù)據(jù)。
執(zhí)行Write時(shí),會(huì)把數(shù)據(jù)放入緩存區(qū),頁(yè)面執(zhí)行完畢后一次性返還給瀏覽器。
二、一般處理程序的IHttpHandler接口
服務(wù)器接收請(qǐng)求,要?jiǎng)?chuàng)建頁(yè)面對(duì)象的時(shí)候,發(fā)現(xiàn)每一個(gè)文件都是一個(gè)類,它不知道如何去調(diào)用方法創(chuàng)建頁(yè)面,于是就需要一個(gè)中間處理——將頁(yè)面類的對(duì)象轉(zhuǎn)成一個(gè)接口IHttpHandler類型,然后通過(guò)調(diào)用接口中的方法來(lái)實(shí)現(xiàn)處理。
一般處理程序是一個(gè)實(shí)現(xiàn)了IHttpHandler特殊接口的類,凡是實(shí)現(xiàn)了這個(gè)接口的類,都能作為一個(gè)外部請(qǐng)求的目標(biāo)程序。
如果被請(qǐng)求的類沒(méi)有實(shí)現(xiàn)這個(gè)接口,在轉(zhuǎn)換的時(shí)候就會(huì)出錯(cuò),提示沒(méi)有實(shí)現(xiàn)IHttpHandler接口。所以,一般處理程序里的方法,實(shí)際上是實(shí)現(xiàn)了IHttpHandler中的方法。
三、一般處理程序細(xì)節(jié)
IHttpHandler是重要的接口,context封裝了所有瀏覽器發(fā)來(lái)的請(qǐng)求報(bào)文,ProcessRequest方法表示頁(yè)面被訪問(wèn)時(shí)調(diào)用這個(gè)方法里的代碼段,是個(gè)入口。Context.Response是對(duì)輸出的封裝,ContextType是響應(yīng)報(bào)文中的ContextType值,是響應(yīng)輸出的方式。
IsReusable是IHttpHandler中的另一個(gè)方法,設(shè)置頁(yè)面是否可以重用,以減少多次訪問(wèn)時(shí)Web服務(wù)器的壓力。
四、詳細(xì)請(qǐng)求流程
服務(wù)器接收到用戶請(qǐng)求,aspnet_isapi.dll將請(qǐng)求移交給Application Domain,它會(huì)間接調(diào)用HttpRuntime的靜態(tài)方法處理用戶的請(qǐng)求。
首先,分析請(qǐng)求報(bào)文,并把請(qǐng)求報(bào)文封裝成HttpWorkerRequest對(duì)象,之后拆解請(qǐng)求報(bào)文,將各個(gè)字段封裝位HttpRequest對(duì)象(這個(gè)對(duì)象包含QueryString和Form方法)。
HttpRequest對(duì)象和HttpResponse對(duì)象等,共同組成了HttpContext對(duì)象。
HttpApplicationFactory類查找Application池中有沒(méi)有現(xiàn)成可用的HttpApplication對(duì)象,如果有就直接拿來(lái)用,如果沒(méi)有,就創(chuàng)建一個(gè)。HttpApplication對(duì)象中有ProcessRequest方法,這個(gè)方法有HttpContext對(duì)象。正好拿剛才的來(lái)用。
HttpApplication對(duì)象進(jìn)入請(qǐng)求管道,先后執(zhí)行19個(gè)委托事件,在第8個(gè)事件時(shí)創(chuàng)建被請(qǐng)求頁(yè)面的對(duì)象,在第11和12個(gè)事件之間執(zhí)行被創(chuàng)建對(duì)象的ProcessRequest方法。
五、WebForm的頁(yè)面生命周期
在請(qǐng)求管道的第11個(gè)事件執(zhí)行被創(chuàng)建頁(yè)面類的PeocessRequest方法后,會(huì)調(diào)用BuildControlsTree方法進(jìn)入頁(yè)面的生命周期。
在頁(yè)面生命周期中會(huì)連續(xù)調(diào)用一連串的事件,其中一個(gè)Render方法會(huì)去遍歷整個(gè)控件樹(shù),生成對(duì)應(yīng)的HTML代碼,最后組合成為整個(gè)頁(yè)面的HTML代碼返還給瀏覽器。
相關(guān)文章
.net 像hao123的快捷郵箱登陸的實(shí)現(xiàn)代碼
.net實(shí)現(xiàn)的像hao123的快捷郵箱登陸的代碼,需要的朋友可以參考下。2010-03-03.net core版 文件上傳/ 支持批量上傳拖拽及預(yù)覽功能(bootstrap fileinput上傳文件)
本篇內(nèi)容主要解決.net core中文件上傳的問(wèn)題 開(kāi)發(fā)環(huán)境:ubuntu+vscode.本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2017-03-03ASP.NET技巧:請(qǐng)求網(wǎng)址并解析返回的html
ASP.NET技巧:請(qǐng)求網(wǎng)址并解析返回的html...2006-09-09基于ASP.NET實(shí)現(xiàn)日期轉(zhuǎn)為大寫的漢字
在寫代碼時(shí)遇到一個(gè)需要將日期轉(zhuǎn)換為中文大寫日期的問(wèn)題,網(wǎng)上找了找,示例不是很多,只有javascript代碼的,下面整理下在ASP.NET中怎么實(shí)現(xiàn)。2016-08-08C#,winform,ShowDialog,子窗體向父窗體傳值
窗體的show方法,沒(méi)有給調(diào)用代碼任何通知,如果需要通知,使用showdialog是一種好的選擇。 在調(diào)用show方法后,show方法后面的代碼會(huì)立即執(zhí)行,2008-08-08ASP.NET MVC使用ActionFilterAttribute實(shí)現(xiàn)權(quán)限限制的方法(附demo源碼下載)
這篇文章主要介紹了ASP.NET MVC使用ActionFilterAttribute實(shí)現(xiàn)權(quán)限限制的方法,結(jié)合實(shí)例形式分析了ASP.NET MVC使用ActionFilterAttribute過(guò)濾類實(shí)現(xiàn)權(quán)限限制的步驟與相關(guān)技巧,并附帶demo源碼供讀者下載,需要的朋友可以參考下2016-04-04asp.net 無(wú)刷新翻頁(yè)就是這么簡(jiǎn)單
前兩天看了一個(gè)自定義分頁(yè)控件,和AspNetPager一樣是實(shí)現(xiàn)IPostBackEventHandler接口,不過(guò)簡(jiǎn)潔許多,就想能不能實(shí)現(xiàn)ICallbackEventHandler接口做到無(wú)刷新分頁(yè)呢?想到了就馬上去做,終于,設(shè)想變成了現(xiàn)實(shí)!!2010-03-03一個(gè)事半功倍的c#方法 動(dòng)態(tài)注冊(cè)按鈕事件
前幾天在網(wǎng)上看見(jiàn)一個(gè)制作計(jì)算器的c#程序,其中有一個(gè)動(dòng)態(tài)注冊(cè)按鈕事件,覺(jué)的很有用。于是實(shí)際操作了一哈, 確實(shí)比較好。2010-04-04Asp.Net如何將多個(gè)RadioButton指定在一個(gè)組中
將多個(gè)RadioButton指定在一個(gè)組中,實(shí)現(xiàn)其實(shí)很簡(jiǎn)單,一句代碼即可,具體如下,希望對(duì)大家有所幫助2013-12-12