只有累積,沒有奇蹟

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
  1. <add path="*.New" type="MyHandler.New,MyHandler" verb="*">
  2. <add path="*.MyNewFileExtension" type="MyHandler.MNFEHandler,MyHandler.dll" verb="GET,HEAD">
  3. </add></add>

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


建立方式
  1. 建立一個實作IHttpModule 的類別。
  2. 並將模組的組件放到應用程式的\bin子目錄下。
  3. 將 <HttpModules> 項目加入至應用程式的 web.config。
  1. <httpmodules>
  2. <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 :如果覺得此篇文章不錯,請幫忙點選「我要推薦」;讓我有持續努力的動力,感謝

Related Posts:

  • [NET] 再探 Task.WaitAll 與 Task.WhenAll 差異前言 之前自己對於 Task.WaitAll 與 WhenAll 有些一知半解的地方,因此進行研究後並撰寫了 [.NET] Task 等待多個任務 - Task.WaitAll 與 Task.WhenAll 文章,最近在與公司同事 Code Review 再度討論起兩者的使用方式,主管也不吝的與團隊成員分享對於 WaitAll 與 WhenAll 主要的看法與使用上的差異,這篇筆記簡單記錄當時討論的內容與結論,內容若有問題歡迎提出來一起討論。… Read More
  • [NET] Task.Run 與 Task.Factory.StartNew前言  從 .NET 4.0 版本新增 TPL (Task Parallel Library) 函式庫,常在公司專案 Code 中可以看到 Task.Run 與 Task.Factory.StartNew 兩種建立任務的方式,某次同事也有提問對兩者的差異性不太明白,因此這篇文章整理自己對於兩者的相關資訊與用法,希望有不清楚或是自己研究錯誤的地方歡迎提出討論 探索問題 Task.Run 與 Task.Factory.StartN… Read More
  • [NET] Task 等待多個任務 - Task.WaitAll 與 Task.WhenAll前言  在開發偶爾會遇到需要起多個 Task ,接著等待這些 Task 都完成在去做後續邏輯處理,.NET 中提供 Task.WaitAll 與 Task.WhenAll 靜態方法來知道所有任務是否執行完成,過去自己對於兩者的差異性不太明白,因此這篇文章整理自己對於兩者的相關資訊與用法,希望有不清楚或是自己研究錯誤的地方歡迎提出討論 探索問題 Task.WaitAll 在以下的 Sample Code 中使用 Task.Run 建立三個… Read More
  • [.NET] Quartz.NET 排程執行異常 - All triggers of Job class set to ERROR state. 問題  最近因為新專案需求是定期到資料庫檢查會員的資料,因此使用 ASP.NET Core Hosting 服務 +  Quartz.NET 作為工作排程器使用,在開發完畢要啟動 Job 驗證正確性時意外跳出異常訊息,錯誤訊息為  Quartz.Simpl.RAMJobStore | All triggers of Job GroupName.ClassName set to ERROR state.&nb… Read More
  • [CheatSheets] ASP.NET MVC 5 Pipeline 前言  在 ASP.NET 開發時生命週期 Life cycle 一直是個很重要的議題,在過去自己為了加深這方面的印象分別針對 ASP.NET Application 寫了篇文章 : [.NET] ASP.NET Application 概述,以及古老時代在開發 WebForm 時寫的 : [.NET] ASP.NET 網頁生命週期 Page Life-Cycle,在撰寫文章的過程中也加深了自己對於 … Read More

0 意見:

張貼留言

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

Design by Anders Noren | Blogger Theme by NewBloggerThemes.com