ASP.NET構(gòu)架與安全機(jī)制
本文講述ASP.NET構(gòu)架與安全機(jī)制和Provider模型,然而在寫作的過(guò)程中,我發(fā)現(xiàn)由于涉及的知識(shí)面太廣,Provider 模型在本文章中的地位已經(jīng)大大降低了。與此同時(shí),我認(rèn)識(shí)到想用十個(gè)Part講述清楚ASP.NET構(gòu)架與安全機(jī)制是不可能的,但我仍會(huì)嘗試用最少的文字講述最多的內(nèi)容。
希望通過(guò)這一系列文章的講解,可以讓你更好的理解ASP.NET構(gòu)架與安全機(jī)制。
Http請(qǐng)求處理流程概述
思考“為什么在地址欄輸入www.tracefact.net就可以看到張子陽(yáng)的個(gè)人空間?”,類似于思考“為什么蘋果是往地上掉不是往天上飄?”。對(duì)于普通訪問(wèn)者來(lái)說(shuō),這就像每天太陽(yáng)東邊升起西邊落下一樣是理所當(dāng)然的;對(duì)于很多程序員來(lái)說(shuō),認(rèn)為這個(gè)與己無(wú)關(guān),不過(guò)是系統(tǒng)管理員或者網(wǎng)管員的責(zé)任。畢竟,IIS是 Windows 的一個(gè)組件,又不是 ASP.NET 的一個(gè)組成部分。而實(shí)際上,從你輕拍回車到頁(yè)面呈現(xiàn)在你眼前的十分之一秒內(nèi),IIS和.Net Framework已經(jīng)做了大量的幕后工作。
你可能覺(jué)得了解這些幕后工作是如何運(yùn)作的無(wú)關(guān)緊要,作為程序員的你只要保證開(kāi)發(fā)出的程序可以高效地運(yùn)行就可以了。然而,在開(kāi)發(fā)過(guò)程中,你卻發(fā)現(xiàn)常常需要使用諸如 HttpContext 這樣的類。這個(gè)時(shí)候,你可曾思考過(guò)這些類的構(gòu)成和類的實(shí)體是如何創(chuàng)建的?你可能簡(jiǎn)單地回答:HttpContext代表當(dāng)前請(qǐng)求的一個(gè)上下文環(huán)境。可你又知道IIS 、Framework、ASP.NET 是如何協(xié)同工作處理每個(gè)Http請(qǐng)求、如何區(qū)分不同的請(qǐng)求、IIS、Framework、ASP.NET三者之間的數(shù)據(jù)如何流動(dòng)么?
回答上面這些問(wèn)題,首先需要了解IIS是如何處理頁(yè)面請(qǐng)求的,這也是理解 Form驗(yàn)證模式和Windows 驗(yàn)證模式 的基礎(chǔ)。
Http請(qǐng)求剛剛到達(dá)服務(wù)器的時(shí)候
當(dāng)服務(wù)器接收到一個(gè) Http請(qǐng)求的時(shí)候,IIS 首先需要決定如何去處理這個(gè)請(qǐng)求(NOTE:服務(wù)器處理一個(gè).htm頁(yè)面和一個(gè).aspx頁(yè)面肯定是不一樣的么)。那IIS依據(jù)什么去處理呢?―― 根據(jù)文件的后綴名。
服務(wù)器獲取所請(qǐng)求的頁(yè)面(NOTE:也可以是文件,比如 jimmy.jpg)的后綴名以后,接下來(lái)會(huì)在服務(wù)器端尋找可以處理這類后綴名的應(yīng)用程序,如果IIS找不到可以處理此類文件的應(yīng)用程序,并且這個(gè)文件也沒(méi)有受到服務(wù)器端的保護(hù)(NOTE:一個(gè)受保護(hù)的例子就是 App_Code中的文件,一個(gè)不受保護(hù)的例子就是你的js腳本),那么IIS將直接把這個(gè)文件返還給客戶端。
能夠處理各種后綴名的應(yīng)用程序,通常被稱為 ISAPI 應(yīng)用程序(NOTE:Internet Server Application Programe Interface,互聯(lián)網(wǎng)服務(wù)器應(yīng)用程序接口)。雖然這 ISAPI 聽(tīng)上去還挺氣派,也算是“應(yīng)用程序”呢,但仔細(xì)看看它的全稱就明白了:它實(shí)際上只是一個(gè)接口,起到一個(gè)代理的作用,它的主要工作是映射所請(qǐng)求的頁(yè)面(文件) 和與此后綴名相對(duì)應(yīng)的實(shí)際的處理程序。
1. HttpRuntime將Http請(qǐng)求轉(zhuǎn)交給 HttpApplication,HttpApplication代表著程序員創(chuàng)建的Web應(yīng)用程序。HttpApplication創(chuàng)建針對(duì)此Http 請(qǐng)求的 HttpContext對(duì)象,這些對(duì)象包含了關(guān)于此請(qǐng)求的諸多其他對(duì)象,主要是HttpRequest、HttpResponse、 HttpSessionState等。這些對(duì)象在程序中可以通過(guò)Page類或者Context類進(jìn)行訪問(wèn)。
2. 接下來(lái)Http請(qǐng)求通過(guò)一些Module,這些Module可以做一些執(zhí)行某個(gè)實(shí)際工作前的事情。
3. 在這一步,執(zhí)行實(shí)際的一些操作,通常也就是.aspx頁(yè)面所完成的業(yè)務(wù)邏輯。
4. Http請(qǐng)求再一次回到Module,此時(shí)Module可以做一些某個(gè)工作已經(jīng)完成了之后的事情。
NOTE:注意我用紅色標(biāo)識(shí)的字,然后回想一下:ASP.NET 中是不是有眾多的 Inserting 、Inserted 之類成對(duì)的事件?其實(shí),這里講述的就是為什么ASP.NET可以將一個(gè)Insert操作分成前后兩部分,然后再分別進(jìn)行事件攔截的幕后原理。
總結(jié)
我首先概要介紹了這系列文章將要為大家講述的主題。然后,我提出了部分程序員存在的一個(gè)問(wèn)題:在一個(gè)比較高的層次上學(xué)習(xí)和使用ASP.NET構(gòu)架與安全機(jī)制。
隨后,我以一個(gè)訪問(wèn)我個(gè)人空間首頁(yè)的例子,引出了本文主要講述的三個(gè)內(nèi)容:
1. Http請(qǐng)求剛剛到達(dá)時(shí)IIS時(shí),IIS 所做的工作。
2. Http請(qǐng)求的宿主環(huán)境。
3. Http管道。
【編輯推薦】