(開賽)Http 請求 Asp.net IIS伺服器架構(第1天)

開賽前言:

三十篇文章架構基本遵循:

  1. 前言:前情提要,閱讀此文建議使用工具或知識.
  2. 標出大主題(大字體+錨點)之後在細項列出要說明的細節
  3. 小結:每篇都有一個小結快速總結今天重點

為什麼想要選擇此主題

選擇這個主題主要原因是

  1. 沒有人整理一套較完整的Asp.net執行原始碼解析文章(從Http請求IIS Server,進入CLR前置動作),asp.net mvc原始碼解析
  2. 台灣大部分的文章都是分享如何使用,很少文章有介紹如何運作.
  3. 利用微軟開原後站在巨人肩膀上可以看更遠,理解MVC框架如何去設計具有一定的彈性.
  4. 了解核心運作流程,更好改善或擴充現有專案架構(讓系統變得更有條理)

閱讀時建議事項

我在文章中會盡量寫出我看到精華部分,但此系列文可能對於MVC新手不太容易閱讀,因為MVC框架中運用到許多設計模式和OOP觀念(當初我在閱讀上也花了不少功夫)

個人覺得OOP有很重要一個點是盡量用物件和物件關聯,資料狀態轉移來了解程式碼.

簡白來說就是物件關聯和關係

文章收穫

我希望大家在閱讀完所有文章後可以獲得

  1. Http對於IIS Server請求如何導向Asp.net MVC執行
  2. Asp.net MVC原始碼有基本了解和知道哪幾個重要類別,了解後能依照系統需要替換改寫.
  3. Asp.net MVC用到很多設計技巧(因為這是一個較大框架),希望大家能更了解設計模式如何運用在實戰中
  4. 閱讀第一個框架原始碼會花不少時間,了解一個大框架後在去看其他框架閱讀時間會越來越少

進入主題

Asp.net基於.NET Framework框架所提供,開發Web應用程式的類別庫,封裝在System.Web.dll檔案中,提供使用者開發網頁,ASP.NET運行在安裝了.NET Framework的IIS(Internet Information Services)伺服器上

微軟大大近幾年也投入Open Source行列讓我們可以更方便來窺探,Asp.net運作原理. 這個連結 Reference Source 可以查看微軟核心的DLL程式碼(這個網站是我們第一階段追code的好朋友)

Asp.net程式基本上是由IIS進行託管,介紹Asp.net MVC原始碼之前我們需要先了解Asp.netIIS關係.

瀏覽器請求IIS流程

Web基於Http協定,它是一個無狀態協定,每次請求都是新的且不會紀錄之前請求的東西
下圖我畫出一個對於IIS請求基本會跑的流程圖.

瀏覽器請求IIS流程

基本分為兩個區塊

  • 粉紅色是IIS Server領域
    • 會有一個Http.sys的程式在監聽所有Http請求並交由W3WP.exe並透過aspnet_isapi來此次請求是否為靜態檔案.
  • 藍色是.Net CLR領域由幾塊核心程式完成請求
    • ISAPIRunTime
    • HttpRuntime
    • HttpApplicationFactory
    • HttpApplication

之後會陸續介紹他們.

  1. 請求靜態檔案透過路徑找尋靜態檔案並回傳.
  2. 請求非靜態檔案透過.Net CLR執行返回結果.

如何辨別是否為靜態檔案?

如何辨別是否為靜態檔案,就需要談談HttpHandler的註冊表(後面有文章會說到)

基本上如果是請求Html,css,js...都會直接回傳不會在經過.Net CLR

.Net CLR Httpmodule & Httphandler 核心模組

Asp.net所有應用程式都離不開兩個核心模組Httpmodule & Httphandler且最終會找到一個繼承於IHttpHanlder物件來處理請求.

在網路上看到一個很好地比喻HttpModule & HttpHandler

Http請求像是一個旅客身上帶著行李拿著票來搭火車.

  • HttpHandler 是火車的終點站.
  • HttpModule 是火車中途停靠的各站.

這個比喻可以很清楚知道每個請求透過CLR就是要找到一個HttpHandler來執行.

圖片參考連結

圖片參考連結

W3WP應用程式

IIS在執行處理Http請求時工作管理員有一個w3wp應用程式在監聽.

此應用程式會依照aspnet_isapi模組來判斷此次請求是否走入.net CLR

w3wp.PNG

小結

今天我們了解到

  1. 瀏覽器請求IIS基本流程
  2. Asp.net核心模組Httpmodule & Httphandler
  3. IIS有一個Http.sys程式在監聽所有Http請求
  4. IIS透過一個w3wp.exe初步過濾判斷如何執行此請求.

瀏覽器發出Http請求給IIS,IIS透過Http.sys來監聽請求並交給w3wp.exe這個應用程式來判斷是否要交由.net託管處理此次請求.

下篇我們會來詳細講述Httpmodule & Httphandler


如果本文對您幫助很大,可街口支付斗內鼓勵石頭^^