IIS站點工作原理與ASP.NET工作原理


IIS站點工作原理與ASP.NET工作原理

 一、IIS

IIS 7.0工作原理圖

兩種模式:

1、用戶模式(User Mode)(運行用戶的程序代碼。限制在特定的范圍內活動、有些操作必須要受到Kernel Mode的檢查才能執行)

2、內核模式(Kernel Mode)(運行系統代碼。)

參考文檔:

http://blog.csdn.net/zhuxiaoyang2000/article/details/8052324

 

Http.sys是Microsoft Windows處理HTTP請求的內核驅動程序,這個東西運行在Kernel Mode模式下。

1、在OS啟動的時候,IIS會把可以訪問的路徑注冊到HTTP.SYS里面,在HTTP.SYS內部形成一個MAP,HTTP.SYSY截獲請求之后根據MAP指向相對應的Application POOL(如果URL不存在映射,直接指向404)

2、Application POOL根據ISAPI的MAP(如下圖)找到對應的處理程序(實際就是擴展名和處理程序的一個MAP)

3、如果在IISAPI MAP當中找不到,看是否是被保護的文件(比如:APP_CODE文件夾,.DLL文件)。如果是被保護的拒絕。

4、沒有被保護,也沒有找到對應的處理程序,則直接返回文件給客戶端

經典模式和集成模式(這個地方在管道地方講)

 

二、HOSTING(宿主)

ASP.NET就是一個程序包,當HTTP請求的時候,入口點就是HttpRuntime

public static void HttpRuntime.ProcessRequest(HttpWorkerRequest wr){}

ProcessRequest用來處理所有請求的信息、所請求的文件、服務器端變量、QueryString、Http 頭信息。最后輸入流(html)給客戶端
每個程序(程序池)實際上是運行在各自的進程中(w3wp.exe),這樣當程序有任何的變動(web.config、dll、錯誤崩潰等)可以相互不影響

1、HTTP.SYS接收請求

2、HTTP.SYS將請求交給IISAPI

3、IISAPI從HTTP.SYS中獲取當前的Httq請求信息,並且將這些信息保存到  HttpWorkerRequest 類中

4、在相互隔離的應用程序域AppDomain(在這里面是進程)中加載HttpRuntime。

5、調用 HttpRuntime的ProcessRequest方法。 將3的HttpWorkerRequest 交給ProcessRequest

6、這個地方處理程序員的代碼

7、IIS把返回的數據流(HTML靜態頁面)交給 HTTP.SYS,最后,HTTP.SYS 再將這些數據返回給客戶端瀏覽器。

三、Pipeline 管道

首先聲明三個概念:ASP.NET應用程序生命周期(宏觀)、 ASP.NET頁生命周期(http://msdn.microsoft.com/zh-cn/library/ms178472(v=vs.100).aspx)(中觀)、控件生命周期(微觀)

“管道模式”針對ASP.NET應用程序生命周期而言,區分為 經典模式和集成模式。

經典模式原理圖(實際就是IIS6的原理圖,IIS7為了兼容,減少升級成本)

集成模式原理圖

從兩張圖的對比當中我們可以看出,IIS6對各種處理程序(html,php,asp,aspx等,都是以擴展的形式來外掛到IIS6當中。它們的地位是平等的),但是在IIS7當中,ASPNET_ISAPI被集成到IIS當中。這樣所有的程序(HTML,PHP,ASPX,ASP,JSP等都可以共同享受.NET的各種功能,比如緩存機制,驗證機制等)

 

從圖中我們可以對HTML文件一樣有效

當Http請求進入 Asp.Net Runtime以后,它的管道由托管模塊(NOTE:Managed Modules)和處理程序(NOTE:Handlers)組成,並且由管道來處理這個 Http請求。這個管道模型是由多個HttpModule和HttpHandler組成,ASP.NET把http請求依次傳遞給管道中各個HttpModule,最終被HttpHandler處理,處理完成后,再次經過管道中的HTTP模塊,把結果返回給客戶端。我們可以在每個HttpModule中都可以干預請求的處理過程。

1、Handlers只有一個。Modules有多個。

 

注意:在http請求的處理過程中,只能調用一個HttpHandler,但可以調用多個HttpModule。
當請求到達HttpModule的時候,系統還沒有對這個請求真正處理,但是我們可以在這個請求傳遞到處理中心(HttpHandler)之前附加一些其它信息,或者截獲的這個請求並作一些額外的工作,也或者終止請求等。在HttpHandler處理完請求之后,我們可以再在相應的HttpModule中把請求處理的結果進行再次加工返回客戶端。

HttpModule
HTTP模塊是實現了System.Web.IhttpModule接口的類。
IHttpModule接口的聲明:

public interface IHttpModule
{
void Init (HttpApplication context);
void Dispose ();
}

Init 方法:系統初始化的時候自動調用,這個方法允許HTTP模塊向HttpApplication 對象中的事件注冊自己的事件處理程序。
Dispose方法: 這個方法給予HTTP模塊在對象被垃圾收集之前執行清理的機會。此方法一般無需編寫代碼。

HTTP模塊可以向System.Web.HttpApplication對象注冊下面一系列事件:
AcquireRequestState 當ASP.NET運行時准備好接收當前HTTP請求的對話狀態的時候引發這個事件。
AuthenticateRequest 當ASP.NET 運行時准備驗證用戶身份的時候引發這個事件。
AuthorizeRequest 當ASP.NET運行時准備授權用戶訪問資源的時候引發這個事件。
BeginRequest 當ASP.NET運行時接收到新的HTTP請求的時候引發這個事件。
Disposed 當ASP.NET完成HTTP請求的處理過程時引發這個事件。
EndRequest 把響應內容發送到客戶端之前引發這個事件。
Error 在處理HTTP請求的過程中出現未處理異常的時候引發這個事件。
PostRequestHandlerExecute 在HTTP處理程序結束執行的時候引發這個事件。
PreRequestHandlerExecute 在ASP.NET開始執行HTTP請求的處理程序之前引發這個事件。在這個事件之后,ASP.NET 把該請求轉發給適當的HTTP處理程序。
PreSendRequestContent 在ASP.NET把響應內容發送到客戶端之前引發這個事件。這個事件允許我們在內容到達客戶端之前改變響應內容。我們可以使用這個事件給頁面輸出添加用於所有頁面的內容。例如通用菜單、頭信息或腳信息。
PreSendRequestHeaders 在ASP.NET把HTTP響應頭信息發送給客戶端之前引發這個事件。在頭信息到達客戶端之前,這個事件允許我們改變它的內容。我們可以使用這個事件在頭信息中添加cookie和自定義數據。
ReleaseRequestState 當ASP.NET結束所搜有的請求處理程序執行的時候引發這個事件。
ResolveRequestCache 我們引發這個事件來決定是否可以使用從輸出緩沖返回的內容來結束請求。這依賴於Web應用程序的輸出緩沖時怎樣設置的。
UpdateRequestCache 當ASP.NET完成了當前的HTTP請求的處理,並且輸出內容已經准備好添加給輸出緩沖的時候,引發這個事件。這依賴於Web應用程序的輸出緩沖是如何設置的。

上面這么多的事件,我們看起來可能會有些眼暈,但沒關系,下面一步一步地看。
HttpModule生命周期示意圖

下面是事件的觸發順序:

BeginRequest和PreRequestHandlerExecute之間的事件是在服務器執行HttpHandler處理之前觸發。
PostRequestHandlerExecute和PreSendRequestContent之間的事件是在服務器執行Handler處理之后觸發。

HttpHandler是HTTP請求的處理中心,真正地對客戶端請求的服務器頁面做出編譯和執行,並將處理過后的信息附加在HTTP請求信息流中再次返回到HttpModule中。
HttpHandler與HttpModule不同,一旦定義了自己的HttpHandler類,那么它對系統的HttpHandler的關系將是“覆蓋”關系。

本文的重點不是詳細介紹如何使用管道,如何使用更詳細的 HTTPMODULE和HTTPHANDLER 請參考(http://www.cnblogs.com/chenlulouis/archive/2009/12/18/1626918.html)

 

參考文檔:

http://www.cnblogs.com/isdavid/archive/2013/05/28/3103228.html

http://blog.csdn.net/fion45/article/details/11592355

http://www.cnblogs.com/linjiancun/archive/2010/09/14/1825662.html

http://www.cnblogs.com/Joans/archive/2012/02/02/2335537.html

https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=IIS%E7%AB%99%E7%82%B9%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86&oq=asp.net%20%E5%8E%9F%E7%90%86&rsv_pq=90c2d9c60009de34&rsv_t=d22cX5FGlDjDQAVk4LxnJbUMHja9pe0wZOLtAQxDHjGs0VKNUa7Ag1ZHGg0&rsv_enter=0&inputT=666&rsv_sug3=40&rsv_sug1=25&rsv_sug7=100&rsv_n=2&bs=asp.net%20%E5%8E%9F%E7%90%86


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM