ASP.NET 處理請求的兩個步驟
當用戶發送一個請求到IIS(這裡指IIS 5.0 & IIS 6.0),ASP.NET 處理請求的步驟有兩種
1. 建立一個可以處理用戶端傳來請求Request的環境(ASP.NET Environment),包括建立application object(應用程式)、Ruquest、Response、Context Object等物件來處理此Ruquest請求。
2. 環境被建立後,應用程式會透過modules、handlers、page objects等事件模組來處理此Ruquest請求。
前言
當你在網址列輸入 www.google.com.tw 後並按下Enter時,瀏覽器會送出一個Request請求到Web Server端,瀏覽器是透過HTTP(HyperText Transfer Protocol)通訊協定與Web Server伺服器做溝通。當你輸入網址後,從Client端發送一個Request到伺服器,當伺服器處於活動狀態和要求內容伺服器認定是有效的話,伺服器會接收並處理此Request,伺服器處理完畢會發送Response 回Client的瀏覽器,瀏覽器在將回傳的結果呈現在網頁上,
關係如下圖
ASP.NET 處理請求的兩個步驟
當用戶發送一個請求到IIS(這裡指IIS 5.0 & IIS 6.0),ASP.NET 處理請求的步驟有兩種
- 建立一個可以處理用戶端傳來請求Request的環境(ASP.NET Environment),包括建立application object(應用程式)、Ruquest、Response、Context Object等物件來處理此Ruquest請求。
- 環境被建立後,應用程式會透過modules、handlers、page objects等事件模組來處理此Ruquest請求。
一、ASP.NET Environment
- 使用者發送一個請求Request到IIS,當Web 伺服器收到請求時,會檢查請求檔案的副檔名、判斷應該處理請求的ISAPI 擴充程式(ISAPI extension),然後將請求傳遞至適當的ISAPI 擴充程式來處理對應到的副檔名。例如:當請求的網頁為「.aspx」時,就會透過「aspnet_isapi.dll」來處理。
- 如果是第一次發送請求到網站時(當ASP.NET接收應用程式中任何資源的第一個要求時),名為 ApplicationManager 的類別會建立應用程式定義域(Application Domain)。
- 應用程式定義域(Application Domain)會建立 HostingEnvironment 物件後,接下來ASP.NET 會建立和初始化核心物件,例如 HttpContext、HttpRequest 和 HttpResponse。HttpContext 類別包含目前應用程式要求的特定物件,例如 HttpRequest 和 HttpResponse 物件。HttpRequest 物件包含目前要求的資訊,包括Cookie 和瀏覽器資訊。HttpResponse 物件包含傳送至用戶端的回應,包括所有呈現的輸出和Cookie。
- 一旦ASP.NET核心元件被建立後,會藉由建立 HttpApplication 類別的執行個體來啟動應用程式。 如果應用程式有定義Global.asax 檔的化,ASP.NET 會改為建立衍生自 HttpApplication 類別的Global.asax 類別執行個體,然後使用衍生的類別代表應用程式。
- HttpApplication物件會指派給要求ASP.NET 核心物件來處理網頁。
- HttpApplication接著透過HTTP module events、handlers、page events來處理此請求。
關係請參考下圖
更多細節請參考:點我點我
二、使用MHPM處理Resuest
當HttpApplication被建立後,HttpApplication就開始準備處理client傳來的請求(Request),在處理的過程中會經歷下列三個模組「HttpModule」、「Page」、「HttpHandler」,分別會觸發不同的事件,開發人員可以依據需求將程式邏輯加入到至事件中,首先先來瞭解「HttpModule」、「HttpHandler」,它們協助開發人員可以在執行ASP.NET網頁開始及結束時,加入客製化的邏輯程式處理來協助開發,兩者主要的差異在於
HttpHandler:如果要加入新的文件類型(副檔名)判斷時,可以在<httpHandlers>設定檔中使用add的方式,將收到的要求對應到適當地處理類別中。
舉例來說
- 要新增判斷副檔名是 .New 之檔案的所有 HTTP 要求,都對應至類別 MyHandler.New
- 將具有副檔名 .MyNewFileExtension 之檔案的 HTTP GET 和 HEAD 要求,都對應至類別 MyHandler.MNFEHandler
Ps : 兩個類別都位於 MyHandler 組件,此組件則是在 MyHandler.dll 檔案中。
更多細節請參考:點我點我
HttpModule:如果要在ASP.NET pipleline(處理管線?)中自訂事件的話,可以透過加入httpModules來實現,例如 SessionStateModule 類別,換句話說,httpModules可以用來實做自訂的HTTP模組。
- 建立一個實作IHttpModule 的類別。
- 並將模組的組件放到應用程式的\bin子目錄下。
- 將 <HttpModules> 項目加入至應用程式的 web.config。
更多細節請參考:點我點我
MHPM 接下來要處理請求Request的四個重要步驟MHPM(HttpModule、HttpHandler、ASP.NET Page、HttpModule)
Step 1(M: HttpModule):接受到用戶端的請求開始,ASP.NET引擎建立HttpModule之後,可以利用六個重要的事件來注入客製化的邏輯程式碼來協助開發,分別是BeginRequest,AuthenticateRequest,AuthorizeRequest,ResolveRequestCache,AcquireRequestState和PreRequestHandlerExecute。
Step 2(H: HttpHandler):一旦上述6個事件被觸發時,ASP.NET引擎將呼叫ProcessRequest事件。(當你的專案有建立HttpHandler時)。
Step 3(P: ASP.NET page):當執行完HttpHandler之後,ASP.NET Page物件就會被建立,當ASP.NET Page物件就會被建立之後, Page 事件也接著被觸發,這些Page事件可以提供開發者加入自訂頁面事件的邏輯在Page事件中,有6個重要的事件,分別是Init, Load, validate, event, render and unload。可以利用「SILVER」來記住Page的事件,S(Start)、I(Init)、L(Load)、V(Validation)、E(Event)、R(Render)、U(Unload)。
Step4(M: HttpModule):當Page物件被建立並執行完Page的事件之後,HttpModule提供四個處理的事件供開發者加入自訂邏輯,分別是PostRequestHandlerExecute、ReleaserequestState、UpdateRequestCache、EndRequest。
沒想到因為一個小小的好奇,可以整理出這樣長篇大論的文章,內容都是從網路上各方高手文章取得
也順便釐清一下自己過去的一些疑問及錯誤觀念(錯誤觀念真多 XD),記錄下來方便日後做參考
如果內容有錯誤的地方,麻煩各位高手給予小弟指導,謝謝 ^^
ps :如果覺得此篇文章不錯,請幫忙點選「我要推薦」;讓我有持續努力的動力,感謝
- http://msdn.microsoft.com/zh-tw/library/ms178473.aspx
- http://technet.microsoft.com/zh-tw/library/dd125465.aspxhttp://lncl.blog.hexun.com.tw/35607208_d.html
- http://www.west-wind.com/presentations/howaspnetworks/howaspnetworks.asp
- http://60.251.1.52/taiwan/msdn/books/ataglance/SecNetAP04.htm
- http://lncl.blog.hexun.com.tw/42601472_d.html
- http://www.west-wind.com/presentations/howaspnetworks/howaspnetworks.asp
- http://vaibhavmayee.com/post/2011/04/14/Process-of-IIS.aspx
-
http://www.codeproject.com/KB/aspnet/ASPDOTNETPageLifecycle.aspx