開賽前言:
三十篇文章架構基本遵循:
前言:
前情提要,閱讀此文建議使用工具或知識.- 標出大主題(大字體+錨點)之後在細項列出要說明的細節
- 小結:每篇都有一個小結快速總結今天重點
為什麼想要選擇此主題
選擇這個主題主要原因是
- 沒有人整理一套較完整的Asp.net執行原始碼解析文章(從
Http
請求IIS Server
,進入CLR
前置動作),asp.net mvc原始碼解析 - 台灣大部分的文章都是分享如何使用,很少文章有介紹如何運作.
- 利用微軟開原後站在巨人肩膀上可以看更遠,理解MVC框架如何去設計具有一定的彈性.
- 了解核心運作流程,更好改善或擴充現有專案架構(讓系統變得更有條理)
閱讀時建議事項
我在文章中會盡量寫出我看到精華部分,但此系列文可能對於MVC新手不太容易閱讀,因為MVC框架中運用到許多設計模式和OOP觀念(當初我在閱讀上也花了不少功夫)
個人覺得OOP有很重要一個點是盡量用物件和物件關聯,資料狀態轉移來了解程式碼.
文章收穫
我希望大家在閱讀完所有文章後可以獲得
- Http對於IIS Server請求如何導向Asp.net MVC執行
- Asp.net MVC原始碼有基本了解和知道哪幾個重要類別,了解後能依照系統需要替換改寫.
- Asp.net MVC用到很多設計技巧(因為這是一個較大框架),希望大家能更了解設計模式如何運用在實戰中
- 閱讀第一個框架原始碼會花不少時間,了解一個大框架後在去看其他框架閱讀時間會越來越少
進入主題
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.net
和IIS
關係.
瀏覽器請求IIS流程
Web基於Http協定,它是一個無狀態協定,每次請求都是新的且不會紀錄之前請求的東西
下圖我畫出一個對於IIS請求基本會跑的流程圖.
基本分為兩個區塊
- 粉紅色是
IIS Server
領域- 會有一個
Http.sys
的程式在監聽所有Http
請求並交由W3WP.exe
並透過aspnet_isapi
來此次請求是否為靜態檔案.
- 會有一個
- 藍色是
.Net CLR
領域由幾塊核心程式完成請求- ISAPIRunTime
- HttpRuntime
- HttpApplicationFactory
- HttpApplication
之後會陸續介紹他們.
- 請求靜態檔案透過路徑找尋靜態檔案並回傳.
- 請求非靜態檔案透過
.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
小結
今天我們了解到
- 瀏覽器請求IIS基本流程
- Asp.net核心模組Httpmodule & Httphandler
- IIS有一個
Http.sys
程式在監聽所有Http
請求 - IIS透過一個
w3wp.exe
初步過濾判斷如何執行此請求.
瀏覽器發出Http請求給IIS,IIS透過Http.sys
來監聽請求並交給w3wp.exe
這個應用程式來判斷是否要交由.net
託管處理此次請求.
下篇我們會來詳細講述Httpmodule & Httphandler
如果本文對您幫助很大,可街口支付斗內鼓勵石頭^^