本篇博客從IIS到asp.net頁面后臺運行完,整個過程做一個簡單的描述,如果有不對的地方,望指出。
我們通過瀏覽器(Socket客戶端)訪問一個IIS服務器上的網頁時,該請求到達IIS服務器上后,IIS的http.sys(分發(fā)器)組件就會根據相應的判斷,將其交給對應的應用程序池(IIS上都有相應的注冊信息),對應的應用程序池接收到請求后,會將其交給相應的工作進程進行處理,工作進程接到請求后,根據請求文件的后綴名,進行判斷,如果此文件IIS可以處理,則直接處理,如果處理不了,就從其注冊的插件配置文件中查找可以處理該請求的插件(asp.net_isapi.dll,也可以是php等等插件),并將其交給該插件(代理),然后,插件就把請求交給真正的處理程序。
從程序的角度上說,瀏覽器就是一個Socket客戶端,而IIS就是一個Socket服務器,從而來實現通信的功能。對于上述,我們可以使用Telnet(Socket客戶端,win自帶安裝程序,需要自己安裝)來進行驗證,cmd中輸入telnet 127.0.0.1 80,就可以連接到服務器,然后發(fā)出請求,就會得到相應的回應,
IIS的插件機制,使得IIS可以服務于任何語言的網站,只要其在IIS上注冊相應的插件,那么,IIS就可以處理這類文件的請求,如,你想通過IIS進行php的服務,只要注冊上php的插件就可以了,這個思想非常的厲害,使IIS的擴展性得到大大的提高,當然,這個插件并不是正真處理請求的程序,而是一個代理,通過這個代理(注冊時寫在IIS配置文件的內容)就可以讓IIS知道自己可以處理這類文件,并且,通過這個代理,可以將這個請求交給正真的程序去處理,當然,返回的結果也是通過這個進行返回的。
我們可以在IIS服務器上,查看處理程序映射中查看其可以處理的文件。如果你是先安裝的VS,后安裝的IIS的話,此時,如果你想讓你的IIS可以處理asp.net的相應文件,需要我們手動的將asp.net_isapi.dll注冊到IIS中,操作:cmd―》目錄定位到安裝在本機的具體版本的.net framework目錄(里面有aspnet_regiis.exe程序)―運行aspnet_regiis.exe -i
asp.net_ispai.dall接受到請求后,將其交給.net framework,然后就開始進行http的管道機制了
.net framework接到請求,實例化HttpRuntime對象,并調用ProcessRequest方法,然后就是通過HttpApplicationFacotry實例化Application對象,在實例化的過程中會繼續(xù)實例化話httpContext、HttpRequest、HttpResponse、Module等等,然后最后實例化IHttpHandler接口的實例。
如果大家注意的話,我們的asp.net頁面就是IHttpHandler接口的一個實現者,asp.net頁面繼承page類,page類繼承IHttpHandler接口,這樣我們的asp.net頁面就可以訪問上面實例化的對象了。另外,Golbal文件繼承HttpApplication文件,這樣,我們就可以通過書寫Golbal中的方法,去往Http管道中的事件進行注冊了。
實例化IHttpHandler接口實例,實際就是實例化asp.net的頁面,而在實例化asp.net頁面的過程,主要經過這幾個事件,初始化,加載,控件事件,保存state,渲染,卸載。這里我們需要知道頁面上控件事件的執(zhí)行是在,預渲染前,在load之后,當然,第一次的時候,是不會有控件事件觸發(fā)的,在初始化階段,完成控件樹的創(chuàng)建和相應屬性的賦值等,所以,在這里階段時不要對控件的屬性值進行操作,因為沒有值,加載過程中,我們可以對控件進行相應的操作,如果想在load之前的話,就在preload中進行操作。
在用文字描述的過程發(fā)現,不描述不知道,一描述的時候,察覺到自己沒有把整個過程仔細想通,然后,經過又一次的查閱資料,才寫出了這些東西,希望對讀者有意,同時也建議讀者去查閱一些別的資料,去加深自己的理解。