IIS7.0與AP.NET

來源:互聯網
上載者:User

標籤:names   nfa   inter   載入   支援   傳回值   反射   應用程式   回收   

  IIS7在請求的監聽和分發機制上進行了革新性的改進,主要體現在對於Windows進行啟用服務(Windows Process Activation Service ,WAS)的引入,將原來的W3SVC的部分功能分流給了WAS。W3SVC的主要功能:HttP請求接收、組態管理、進程管理。

  IIS7將後兩組功能實現到了WAS中,接收Http請求的任務依然落在W3SVC上,WAS的引入為IIS7.0提供了對非Http協議的支援。WAS通過監聽器適配器介面抽象出針對不同協議的監聽器。具體說,除了給予網路驅動的HTTP.SYS提供的HTTP請求監聽功能外還提供了TCP監聽器、具名管道監聽器和MSMQ監聽器以提供基於TCP、具名管道和MSMQ傳說協議的監聽支援。這三種非HTTP監聽器和監聽適配器定義在程式集SMHost.exe中。

  WCF提供的這三種監聽器和監聽適配器最終以Windows服務的形勢體現。可以通過服務工作管理器對其進行單獨的啟動、終止:

  •   NetTcpPortSharing:為WCF提供TCP連接埠共用。
  •   NetTcpActivator:為WAS提供給予TCP啟用的請求。
  •   NetPipeActivator:為WAS提供給予具名管道的啟用請求
  •   NetMsmqActivator:為WAS提供給予MSMQ的啟用請求

  

揭示了IIS7的整體架構及整個請求處理流程。無論是從W3SVC接收到的HTTP請求,還是通過WCF提供的監聽適配器接收到的請求,最終都會傳遞到WAS。如果相應的工作流程並未建立則建立它,否則將請求分發給對應的背景工作處理序進行後續的處理。WAS在進行請求處理過程中,通過內建的組態管理模組載入相關的配置資訊,並對相關的組件進行配置。。IIS7將配置資訊存放於XML形式的設定檔中,基本的配置存放在applicationHost.config中。

  IIS7中實現了“你中有我,我中有你”的整合式管線設計

  •   可以通過本地代碼和Managed 程式碼兩種方式定義IIS Module
  •   將ASP.NET提供的一些強大功能應用到原來難以企及的地方比如URL重寫置於身分識別驗證之前
  •   採用相同的方式去實現、配置、檢測和支援一些伺服器特性比如:Module、Handler映射、定製錯誤配置等
請求管道的處理

主要描述ASP.NET請求的處理(粗略的)

  如果HTTP.SYS接收到的HTTP請求時對該Web應用的第一次訪問,在成功載入了運行時後,IIS會通過AppDomainFactory為該Web應用建立一個應用程式定義域,隨後一個特殊的運行時IsapiRuntime被載入。IsapiRuntiome定義在程式集System.Web中,對應的命名空間為System.Web.Hosting,被載入的IsapiRuntime會接管該Http請求。

  IsapiRuntime會首先建立一個IsapiWorkerRequest對象,用於封裝當前的Http請求,並將IsapiWorkerRequest對象床底給ASP.NET運行時HttpRuntime、從此時起,Http請求正式進入了ASP.NET管道。HttpRuntime會根據IsapiWorkerRequest對象建立用於標示當前Http請求的內容物件HttpContext。

  隨著HttpContext被建立成功,HttpRuntime會利用HttpApplication建立新的或擷取現有的HttpApplication對象。實際上ASP.NET維護者一個HttpApplication對象池,HttpApplication從翅中選取可用的HttpApplication用於處理HTTP請求,處理完畢後將其釋放到對象池中。HttpApplication負責處理當前的HTTP請求。

  在HttpApplication初始化過程中,會根據設定檔載入並初始化相應的HttpModule對象。對於Httpapplication來說,在它處理HTTP請求的不同階段會觸發不同的事件(Event),而HttpModule的意義在於通過註冊HttpApplication相應的事件,將所需的操作注入整個HTTP請求的處理流程。asp.net的很多功能,比如:身分識別驗證、授權、緩衝等,都是通過相應的HttpModule實現的

  最終實現對HTTP請求的處理實現在HttpHandler中,對於不同的資源類型,具有不同的HttpHandler。比如aspx頁面對應的HttpHandler為System.Web.UI.Page,WCF的.svc檔案對應的Httphandler為System.ServiceModel.Activation.HttpHandler。整個的流程圖:

HttpApplication

  HttpApplication是整個ASP.NET基礎架構的核心,它負責處理分發給他的HTTP請求。由於一個HttpApplication對象在某個時刻只能處理一個請求,只有完成對某個請求的處理後,HttpApplication才能用於後續的請求處理。所以ASP.NET採用對象池的機制來建立或擷取HttpApplication獨享。

  當第一個請求抵達時,ASP.NET會一次建立多HttpApplication對象,並將其置於池中。選擇其中一個對象來處理該請求。處理完畢後,HttpApplication不會被回收,而是釋放到池中。對於後續的請求,閒置HttpApplication對象會從池中取出,如果池中HttpApplication對象都處於繁忙狀態,ASP.NET會建立新的HttpApplication對象。

HttpModule

  當請求轉入ASP.NET管道時,最終負責處理該請求的是與請求資源類型相匹配的HttpHandler對象,但是在Handler正式工作之前,ASP.NET會先載入並初始化所有配置的HttpModule對象。HttpModule在初始化過程中,會將一些功能註冊到HttpApplication相應的事件中,在HttpApplication請求處理生命週期的某個階段,相應的事件會被觸發,通過HttpModule註冊的事件處理常式得以執行。

  所有的HttpModule都實現了具有如下定義的System.Web.IHttpModule介面,其中Init()用於實現HttpModule自身的初始化,該方法接收一個HttpApplication對象,,有了這個對象,事件註冊就很容易了

 1 namespace System.Web 2 { 3     using System; 4      5     public interface IHttpModule 6     { 7         void Dispose(); 8         void Init(HttpApplication context); 9     }10 }

  基於HttpModule實現的功能:

  •   OutputCacheModule:實現了輸出緩衝的功能
  •   SessionStateModule:在無狀態的HTTP協議上實現了基於會話的Session的狀態
  •   WindowsAuthenticationModule+FormsAuthenticationModule+PassportAuthenticationModule:實現了windows、Forms和Passport這3種經典的身分識別驗證
  •   UrlAuthorizationModule+FileAuthorizationModule:實現了基於URI和檔案ACL的授權

  除了這些系統的HttpModule之外,還可以自訂HttpModule,通過WebConfig註冊。

HttpHandler

  對於不同資源類型的請求,ASP.NET會載入不同的Handler來處理,也就是說.aspx頁與asmx web 服務對應的Handler是不同的。所有的HttpHandler都實現了具有入下定義的介面System.Web.IHttpHandler,ProcessRequest提供了處理請求的實現

 1 namespace System.Web 2 { 3     using System; 4      5     public interface IHttpHandler 6     { 7         void ProcessRequest(HttpContext context); 8          9         bool IsReusable { get; }10     }11 }

  某些HttpHandler具有一個與值相關的HttpHandlerFactory,它實現了具有如下定義的System.Web.IHttpHandlerFactory,方法GetHandler用於建立新的HttpHandler,或者擷取已經存在HttpHandler

 1 namespace System.Web 2 { 3     using System; 4      5     public interface IHttpHandlerFactory 6     { 7         IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated); 8         void ReleaseHandler(IHttpHandler handler); 9     }10 }
Route

一個HTTP請求會經過至少一個HttpModule的處理。UrlRoutingModule是非常重要的模組,它是路由系統的核心。路由系統的職責是從請求URL中擷取controller和action的名稱以及其它請求資料。
UrlRoutingModule根據當前請求的URL和RouteTable中登入的路由模板進行匹配並返回第一個和當前請求相匹配的路有對象Route,然後根據路有對象擷取路由資料對象RouteData(ASP.NET MVC中,路由資料必須包含controller和action的名稱),再由RouteData擷取IRouteHandler最終由IRouteHandler得到IHttpHandler

Controller

IHttpHandlerProcessRequest方法中對當前請求進行處理,在該方法中通過ControllerBuilder得到IControllerFactory然後通過反射的方式擷取Controller的類型。

Action

ASP.NET MVC中ControllerBase是所有Controller的基類,在該類型的Execute方法中通過IActionInvokerInvokeAction方法來執行對Action的調用。在Action執行前會進行模型繫結和模型認證操作。

Filters

常用的過濾器有5個:IAuthenticationFilterIAuthorizationFilterIActionFilterIResultFilterIExceptionFilter
在ASP.NET MVC中所有的過濾器最終都會被封裝為Filter對象,該對象中FilterScope類型的屬性Scopeint類型屬性Order用於決定過濾器執行的先後順序,具體規則如下:

    • OrderFilterScope的數值越小,過濾器的執行優先順序越高;
    • OrderFilterScope具有更高的優先順序,在Order屬性值相同時FilterScope才會被考慮
    • 1 //數值越小,執行優先順序越高2 public enum FilterScope3 {4     Action= 30,5     Controller= 20,6     First= 0,7     Global= 10,8     Last= 1009 }
      View Code

       

ActionResult

Action執行完畢之後會返回ActionResult類型對象作為對此次請求進行處理的結果,對於不是ActionResult類型的傳回值,ASP.NET MVC會將其轉換為ActionResult類型。

請求生命週期

 

IIS7.0與AP.NET

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

Tags Index: