一、概述
不管是什么語言開發(fā)的web應(yīng)用程序,都是在解決一個(gè)問題,那就是用戶輸入url怎么把對應(yīng)的頁面響應(yīng)出來,如何通過url映射到響應(yīng)的類,由于自己做asp.net的時(shí)間也不短了,還算是對asp.net的整個(gè)流程還算是了解,所以在自學(xué)JavaWeb的時(shí)候也很好奇JavaWeb中是如何處理的。
二、asp.net的工作原理
下面的對asp.net的工作流程的介紹(紅字)以及我個(gè)人的理解。這里也給學(xué)asp.net的推薦一本書<<asp.net本質(zhì)論>>,這本書對http請求流程講的比較詳細(xì),也是一本挺不錯(cuò)的書。
以IIS 6.0為例,在工作進(jìn)程w3wp.exe中,利用Aspnet_ispai.dll加載.NET運(yùn)行時(shí)(如果.NET運(yùn)行時(shí)尚未加載)。IIS 6引入了應(yīng)用程序池的概念,一個(gè)工作進(jìn)程對應(yīng)著一個(gè)應(yīng)用程序池。一個(gè)應(yīng)用程序池可以承載一個(gè)或者多個(gè)Web應(yīng)用,每個(gè)Web應(yīng)用映射到一個(gè)IIS虛擬目錄。與IIS 5.x一樣,每一個(gè)Web應(yīng)用運(yùn)行在各自的應(yīng)用程序域中。
下圖是我本地電腦的IIS應(yīng)用程序池列表。
上圖紅線部分也顯示的很清楚,應(yīng)用程序池與工作進(jìn)程相關(guān)聯(lián),包含一個(gè)或多個(gè)應(yīng)用程序,并提供不同應(yīng)用之間的隔離。在我本地Test應(yīng)用池中就有2個(gè)應(yīng)用。具體創(chuàng)建可以參考Nginx負(fù)載均衡篇http://www.cnblogs.com/5ishare/p/6129775.html.
如果HTTP.SYS接收到的HTTP請求是對該Web應(yīng)用的第一次訪問,當(dāng)成功加載了運(yùn)行時(shí)后,會(huì)通過AppDomainFactory為該Web應(yīng)用創(chuàng)建一個(gè)應(yīng)用程序域(AppDomain)。隨后,一個(gè)特殊的運(yùn)行時(shí)IsapiRuntime被加載。IsapiRuntime定義在程序集System.Web中,對應(yīng)的命名空間為System.Web.Hosting。IsapiRuntime會(huì)接管該HTTP請求。
這里的應(yīng)用程序域提供了四個(gè)重要的機(jī)制。
1.隔離 不同應(yīng)用程序域直接不能直接訪問