只有累積,沒有奇蹟

2018年11月1日 星期四

[.NET] ASP.NET Application 概述

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 處理請求的步驟有兩種
  1. 建立一個可以處理用戶端傳來請求Request的環境(ASP.NET Environment),包括建立application object(應用程式)、Ruquest、Response、Context Object等物件來處理此Ruquest請求。
  2. 環境被建立後,應用程式會透過modules、handlers、page objects等事件模組來處理此Ruquest請求。
一、ASP.NET Environment
  1. 使用者發送一個請求Request到IIS,當Web 伺服器收到請求時,會檢查請求檔案的副檔名、判斷應該處理請求的ISAPI 擴充程式(ISAPI extension),然後將請求傳遞至適當的ISAPI 擴充程式來處理對應到的副檔名。例如:當請求的網頁為「.aspx」時,就會透過「aspnet_isapi.dll」來處理。
  2. 如果是第一次發送請求到網站時(當ASP.NET接收應用程式中任何資源的第一個要求時),名為 ApplicationManager 的類別會建立應用程式定義域(Application Domain)。
  3. 應用程式定義域(Application Domain)會建立 HostingEnvironment 物件後,接下來ASP.NET 會建立和初始化核心物件,例如 HttpContextHttpRequest 和 HttpResponseHttpContext 類別包含目前應用程式要求的特定物件,例如 HttpRequest 和 HttpResponse 物件。HttpRequest 物件包含目前要求的資訊,包括Cookie 和瀏覽器資訊。HttpResponse 物件包含傳送至用戶端的回應,包括所有呈現的輸出和Cookie。
  4. 一旦ASP.NET核心元件被建立後,會藉由建立 HttpApplication 類別的執行個體來啟動應用程式。 如果應用程式有定義Global.asax 檔的化,ASP.NET 會改為建立衍生自 HttpApplication 類別的Global.asax 類別執行個體,然後使用衍生的類別代表應用程式。
  5. HttpApplication物件會指派給要求ASP.NET 核心物件來處理網頁。
  6. HttpApplication接著透過HTTP module events、handlers、page events來處理此請求。

關係請參考下圖


更多細節請參考:點我點我
二、使用MHPM處理Resuest
    當HttpApplication被建立後,HttpApplication就開始準備處理client傳來的請求(Request),在處理的過程中會經歷下列三個模組「HttpModule」、「Page」、「HttpHandler」,分別會觸發不同的事件,開發人員可以依據需求將程式邏輯加入到至事件中,首先先來瞭解「HttpModule」、「HttpHandler」,它們協助開發人員可以在執行ASP.NET網頁開始及結束時,加入客製化的邏輯程式處理來協助開發,兩者主要的差異在於
HttpHandler:如果要加入新的文件類型(副檔名)判斷時,可以在<httpHandlers>設定檔中使用add的方式,將收到的要求對應到適當地處理類別中。

舉例來說
  1. 要新增判斷副檔名是 .New 之檔案的所有 HTTP 要求,都對應至類別 MyHandler.New
  2. 將具有副檔名 .MyNewFileExtension 之檔案的 HTTP GET 和 HEAD 要求,都對應至類別 MyHandler.MNFEHandler
<add path="*.New" type="MyHandler.New,MyHandler" verb="*">
    <add path="*.MyNewFileExtension" type="MyHandler.MNFEHandler,MyHandler.dll" verb="GET,HEAD">
</add></add>
    


Ps : 兩個類別都位於 MyHandler 組件,此組件則是在 MyHandler.dll 檔案中。
更多細節請參考:點我點我
HttpModule:如果要在ASP.NET pipleline(處理管線?)中自訂事件的話,可以透過加入httpModules來實現,例如 SessionStateModule 類別,換句話說,httpModules可以用來實做自訂的HTTP模組。


建立方式
  1. 建立一個實作IHttpModule 的類別。
  2. 並將模組的組件放到應用程式的\bin子目錄下。
  3. 將 <HttpModules> 項目加入至應用程式的 web.config。
<httpmodules>
    <add name="modulename" type="namespace. classname, assemblyname"></add></httpmodules>

    

更多細節請參考:點我點我
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 :如果覺得此篇文章不錯,請幫忙點選「我要推薦」;讓我有持續努力的動力,感謝

0 意見:

張貼留言

Copyright © m@rcus 學習筆記 | Powered by Blogger

Design by Anders Noren | Blogger Theme by NewBloggerThemes.com