ASP.NET中Web應(yīng)用程序
HTTP 協(xié)議之所以能夠獲得如此大的成功,其設(shè)計(jì)實(shí)現(xiàn)的簡(jiǎn)潔性和無(wú)狀態(tài)連接的高效率是很重要的原因。而為了在無(wú)狀態(tài)的 HTTP 請(qǐng)求和有狀態(tài)的客戶端操作之間達(dá)到平衡,產(chǎn)生了服務(wù)器端會(huì)話 (Session) 的概念。客戶端在連接到服務(wù)器后,就由 Web 服務(wù)器產(chǎn)生并維護(hù)一個(gè)客戶端的會(huì)話;當(dāng)客戶端通過(guò)無(wú)狀態(tài) HTTP 協(xié)議再次連接到服務(wù)器時(shí),服務(wù)器根據(jù)客戶端提交的某種憑據(jù),如 Cookie 或 URL 參數(shù),將客戶關(guān)聯(lián)到某個(gè)會(huì)話上。這種思路在各種開(kāi)發(fā)語(yǔ)言和開(kāi)發(fā)環(huán)境中大量得到應(yīng)用。
在 ASP.NET 中,Web應(yīng)用程序和會(huì)話狀態(tài)被分別進(jìn)行維護(hù),通過(guò) HttpApplication 和 HttpSessionState 分離 Web應(yīng)用程序與會(huì)話的功能。應(yīng)用程序?qū)舆壿嬙?Global.asax 文件中實(shí)現(xiàn),運(yùn)行時(shí)編譯成 System.Web.HttpApplication 的實(shí)例;會(huì)話則作為單獨(dú)的 System.Web.SessionState.HttpSessionState 實(shí)例,由服務(wù)器統(tǒng)一為每個(gè)用戶會(huì)話維護(hù),通過(guò) ASP.NET 頁(yè)面編譯成的 System.Web.UI.Page 對(duì)象子類的 Session 屬性訪問(wèn)。關(guān)于 ASP.NET 中不同層次關(guān)系可參考我以前的一篇文章《.NET 1.1中預(yù)編譯ASP.NET頁(yè)面實(shí)現(xiàn)原理淺析 自動(dòng)預(yù)編譯機(jī)制淺析》。
ASP.NET 在處理客戶端請(qǐng)求時(shí),首先將根據(jù)客戶端環(huán)境,生成一個(gè) System.Web.HttpContext 對(duì)象,并將此對(duì)象作為執(zhí)行上下文傳遞給后面的頁(yè)面執(zhí)行代碼。
我們可以看到,HttpRuntime 在處理頁(yè)面請(qǐng)求之前,根據(jù) HttpWorkerRequest 中給出的環(huán)境,構(gòu)造 HttpContext 對(duì)象,并以次對(duì)象作為參數(shù)從應(yīng)用程序池中獲取可用應(yīng)用程序。簡(jiǎn)要代碼如下:
以下內(nèi)容為程序代碼:
- private void HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr)
- {
- // 構(gòu)造 HTTP 調(diào)用上下文對(duì)象
- HttpContext ctxt = new HttpContext(wr, 0);
- //...
- // 獲取當(dāng)前 Web 應(yīng)用程序?qū)嵗?
- IHttpHandler handler = HttpApplicationFactory.GetApplicationInstance(ctxt);
- // 調(diào)用 handler 實(shí)際處理頁(yè)面請(qǐng)求
- }
以上介紹ASP.NET中Web應(yīng)用程序
【編輯推薦】