做爲一個Asp.Net平臺開發者,很是有必要了解IIS和Asp.Net是如何結合,執行咱們的託管代碼,以及Asp.Net管道事件的.html
本節目錄web
InetInfo.exe與W3SVC服務編程
IIS 5.x運行在進程InetInfo.exe中,在該進程中一個最重要的服務就是名爲World Wide Web Publishing Service(簡稱W3SVC)的Windows Service。api
W3SVC的主要功能包括HTTP請求的監聽、工做進程的管理以及配置管理(經過從Metabase中加載相關配置信息)等。緩存
請求資源(根據擴展名區分靜態和動態資源)服務器
靜態文件,直接返回文件內容。網絡
動態資源,經過擴展名從IIS的腳本影射(Script Map)找到相應的ISAPI Dll。app
ISAPIide
ISAPI是Internet服務器API(Internet Server Application Programming Interface)的縮寫.是IIS和其餘應用的紐帶.
ISAPI包括ISAPI Extension和ISAPI Filter
ISAPI Extension
不用種類的動態資源,會有不一樣的ISAPI擴展.
如Asp.Net(.aspx .asmx .svc等)則爲aspnet_isapi.dll。在目錄「%windir%\Microsoft.NET\Framework\{version no}\」中找到該dll。
ISAPI Filter
Filter則能夠在HTTP請求真正被處理以前查看、修改、轉發或者拒絕請求,好比IIS能夠利用ISAPI篩選進行請求的驗證(Authentication)。
請求Asp.Net
若是咱們請求的是一個基於ASP.NET的資源:
說明:
IIS5的不足
IIS6解決辦法
另外在IIS6中,建立新的http監聽器:HTTP協議棧(HTTP Protocol Stack,HTTP.SYS)
請求Asp.Net
與IIS5.X不一樣的是:
1.W3SVC服務根據請求建立工做進程
2.aspnet_isapi.dll是在工做進程的初始化過程當中被加載。
說明:
W3SVC服務
在IIS6中的W3SVC服務的功能
在IIS7中W3SVC只負責第一個功能,剩餘功能交給WAS服務管理
WAS服務
IIS7引入Windows進程激活服務(Windows Process Activation Service,WAS):同時處理HTTP和非HTTP請求。
在WAS中,定義了一個重要的接口:監聽器適配器接口(Listener Adapter Interface)抽象出不一樣協議監聽器監聽到的請求。
WAS將監聽W3SVC服務的http請求以及WCF服務的TCP、Named Pipes、MSMQ3種請求.
說明
WCF提供的這3種監聽器和監聽適配器定義在程序集SMHost.exe中,你能夠經過下面的目錄找到該程序集:%windir%\Microsoft.NET\Framework\v3.0\Windows Communication Foundation。
SMHost.exe提供了4個重要的Windows Service:
傳統模式的缺點
集成模式
實際上IIS7集成模式,就是讓用戶能夠經過編寫託管代碼的module,把託管代碼插入到IIS內核代碼中來解析,方便你們精確控制任意請求,帶來更好的擴展性。
(這裏面每一個靜態文件也會通過生命週期事件,執行效率確定會有所降低.)
配置文件上的區別
<!--傳統模式--> <system.web> <customErrors mode="RemoteOnly"> <error statusCode="404" redirect="404.html"/> <error statusCode="500" redirect="500.html"/> </customErrors> <compilation debug="true" targetFramework="4.5" /> <httpRuntime targetFramework="4.5" /> </system.web> <!--集成模式--> <system.webServer> <httpErrors errorMode="DetailedLocalOnly"> <clear/> <error path="404.html" statusCode="404"/> <error path="500.html" statusCode="500"/> </httpErrors> </system.webServer>
擴展
從功能上講,HttpModule之於ASP.NET,就比如ISAPI Filter之於IIS同樣。IIS將接收到的請求分發給相應的ISAPI Extension以前,註冊的ISAPI Filter會先截獲該請求。
若是說HttpModule至關於IIS的ISAPI Filter的話,咱們能夠說HttpHandler則至關於IIS的ISAPI Extension,HttpHandler在ASP.NET中扮演請求的最終處理者的角色。
當請求轉入ASP.NET管道後,最終負責處理該請求的是與請求資源類型相匹配的HttpHandler對象,可是在Handler正式工做以前,ASP.NET會先加載並初始化全部配置的HttpModule對象。HttpModule在初始化的過程當中,會將一些功能註冊到HttpApplication相應的事件中,那麼在HttpApplication整個請求處理生命週期中的某個階段,相應的事件會被觸發,經過HttpModule註冊的事件處理程序也得以執行。
全部的HttpModule都實現了IHttpModule接口.
namespace System.Web { public interface IHttpModule { void Init(HttpApplication context); void Dispose(); } }
系統定義的HttpModule
自定義HttpMoudle
對於不一樣資源類型的請求,ASP.NET會加載不一樣的Handler來處理,也就是說.aspx page與.asmx web service對應的Handler是不一樣的。
全部的HttpHandler都實現了接口IHttpHandler。
public interface IHttpHandler { bool IsReusable { get; } void ProcessRequest(HttpContext context); }
系統定義的HttpHandle
WebForm的aspx文件:System.Web.UI.Page
WCF的svc文件:System.ServiceModel.Activation.HttpHandler
MVC:MVCHandler
自定義HttpHandle
因爲Handle是在PostMapRequestHandler前和 PostResolveRequestCache 後映射指定的Handle,
因此咱們能夠在PostResolveRequestCache事件中註冊咱們的Handle.
在PreRequestHandlerExecute 後將會調用咱們的Handle.PR方法.
擴展
HttpApplication主要有19個事件,經過個人網站任意地址+參數便可訪問全部事件。
+?pipe能夠查看這些事件觸發時間.如:http://neverc.cn?pipe
+?pe能夠附帶個人網站內容:http://neverc.cn?pe
猜猜如何實現出以上效果
本文地址:http://neverc.cnblogs.com/p/4807836.html
本文參考: http://www.cnblogs.com/artech/archive/2009/06/20/1507165.html