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