ASP.NET MVC的請求處理管道股份許多共同點與傳統的ASP.NET Web表單都利用IIS坐標。然而,不像ASP.NET MVC Web窗體,給你更多的靈活性,你可以修改任何一個你自己的喜好,甚至重新調整或更換部件的。最重要的區別是地方的路由(當然你可以在傳統的ASP.NET Web表單,MVC路由相似但不是默認)和控制器踢,和過濾器擴展你的能力,更大的規模以及。
本文將指導你通過這個無限擴展的請求處理管道,主要討論了四個主要的步驟來幫助你抓住大的想法和理解什麼是要在幕後場景。
1.iis
互聯網信息服務,如微軟的Web服務器系統,作爲ASP.NET請求處理的骨幹。當每個HTTP請求到服務器,一個內核模式設備驅動程序稱爲HTTP.SYS將首先分類根據其請求的URL請求,端口和IP地址的組合,然後轉發給一個已註冊的應用程序如IIS網站。
基本上是建立在ASP.NET,ASP.NET MVC的ASP.NET核心,必須保證正常工作的ASP.NET MVC應用程序池啓用。當您創建IIS這樣一個網站,一個應用程序池的設置應指定適當的ASP.NET工作線程池來照顧的HTTP請求。你可以修改應用程序池如託管管線模式設置多,但這方面是偏離了這篇文章的目的和不會在這裏討論。
當一個請求到達一個ASP.NET啓用IIS網站,ASP.NET會從應用程序池工作線程被派遣來對付請求。它向每個註冊HTTP模塊,一個新的請求開始。HTTP模塊。NET類實現IHttpModule接口,你可以連接到ASP.NET請求處理管道。他們通常用於處理特定的事件,如路由信息登錄請求的生命週期。
一個特別重要的HTTP模塊是由任何ASP.NET MVC應用程序的默認註冊:urlroutingmodule。這個模塊是核心路由系統,在請求處理管道的第二步驟中起着最重要的角色開始。如果你工作在MVC 2目標。3.5,你會發現這個模塊在Web.config文件中註冊。在另一方面。4,urlroutingmodule從web.config文件,默認配置機器廣泛引用。看到它的安裝和運行,你可以在模塊在IIS標籤您在Internet信息服務(IIS)經理現場一看。
2。核心路由
system.web.routing組件調用時,urlroutingmodule介入處理一個請求。路由的核心工作是關於認識和分析輸入的URL,設置請求上下文的數據結構,隨後的組件可以使用任何他們希望如ASP.NET MVC使用它來控制傳遞到相關MVC控制器類和動作方法參數的供應。
核心的ASP.NET MVC路由將首先查看傳入請求的URL是對一個靜態的文件(如圖像文件或磁盤上的樣式表文件)。如果是這樣,核心路由將通過把它留到IIS。IIS將提供給客戶直接使工藝可以有效地完成。
另一方面,如果輸入的URL不目標磁盤上的靜態文件,例如,它映射到一個MVC控制器,核心路由系統將追究其主動配置如何處理傳入的URL。
如何配置路由是在一個靜態的集合稱爲system.web.routing.routetable.routes。此集合中的每個條目代表一個不同的URL模式應用程序希望接受,例如,/商店/目錄/ {id},和約束,限制每個參數的可接受的值的範圍。此外,每個條目將提供一個路由處理程序對象實現iroutehandler從而接管和工藝的要求。的路由。在ASP.NET MVC應用程序路徑集合通常是通過添加代碼的方法稱爲registerroutes()在global.asax文件設置。
以符合特定的傳入請求,核心路由系統是通過路由。從上到下收集路線,選擇相匹配的URL模式的第一項。找到匹配項,路由傳輸控制,進入指定的路由處理器,一個請求上下文的數據結構,描述了路由條目和參數的URL解析。MVC框架,然後在行動上。
3。控制器和操作
達到這一步,核心路由系統在路由選擇的特定項目。路線,並解析任何路由參數的URL和包裝他們請求上下文數據結構裏面。現在是控制器和行動進入現場的時間。
在一般情況下,ASP.NET MVC應用程序,幾乎所有的路由條目指定一個特定的路由處理程序:mvcroutehandler。它是內置的默認路由處理程序的ASP.NET MVC和它知道如何以請求的上下文數據,調用相應的控制器類。這是通過使用一個控制器工廠對象。默認情況下,該defaultcontrollerfactory使用,但是它可以通過自定義控制器工廠代替案例特別關注
提高例如依賴注入的需求。
當一個相應的控制器,由控制器工廠對象選擇,其執行的方法被稱爲。執行是IController接口,每個控制器類中定義的唯一方法必須實現這樣的接口:
publicinterfaceicontroller
{
無效的執行(requestcontextrequestcontext);
}
請注意,RequestContext參數提供的所有請求的上下文數據的路由系統的構建,包括參數的解析,從傳入請求URL。它還提供了訪問請求和響應對象。
在大多數情況下,你將與高層次的控制器類包和隱藏的執行方法的底層細節IController接口定義。因此,你基本上不會寫數據到響應流直接。相反,你返回一個行動的結果,描述預期輸出你的控制器。例如,如果你返回一個ViewResult這樣的控制器的目標是提供一個視圖,或redirecttorouteresult如果你想請求重定向到一個不同的動作方法或一個不同的控制器。MVC框架將負責執行的請求處理管道的結果在適當的時刻。
請注意,過濾器可以被連接到一個控制器類或一個動作方法注入額外的邏輯運行之前或之後的行動方法,或前或後的行動結果的執行。過濾器是非常靈活的,他們的邏輯可以運行在許多可能的時刻,在這一步的請求處理管道。
總之,控制器和動作是整個ASP.NET MVC框架的中心支柱。
4。行動的結果和意見
在這一點上,MVC框架會問你的控制器返回的ActionResult對象執行。ActionResult什麼類型的actionresultdoes,要麼返回一個字符串的瀏覽器,產生一個HTTP重定向或最有趣的部分來渲染一個視圖。
這是渲染一個視圖的工作即是ViewResult ActionResult。這是一個能夠定位並提供一個特別的角度,沿着任何可視數據結構作用的方法構建了。它通過調用“視圖引擎”(例如,Web窗體視圖引擎MVC 2和MVC 3 Razor視圖引擎)由控制器確定。
在傳統的ASP.NET Web表單,每個Web窗體ASPX頁面有一個專用的管道在其自己的,基於飛ASPX / ASCX編譯和運行通過一系列的事件稱爲頁面生命週期。ASP.NET MVC講述一個不同的故事。它的視圖頁面簡單只包含用戶界面邏輯。在Web窗體頁的文件也沒有生命週期沒有任何代碼,它把你從一個智能的UI設計的溼地更好的架構對關注點分離。
------------------------------------------------------
下面的工作流程圖可以幫助你更好地理解ASP.NET MVC請求處理管道。