1. 程式人生 > >IIS7.0與AP.NET

IIS7.0與AP.NET

asp tin 接收http 初始化過程 out was tran 一次 現在

  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中實現了“你中有我,我中有你”的集成管道設計

技術分享

  •   可以通過本地代碼和托管代碼兩種方式定義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 FilterScope
      3 {
      4     Action= 30,
      5     Controller= 20,
      6     First= 0,
      7     Global= 10,
      8     Last= 100
      9 }
      View Code

ActionResult

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

請求生命周期

技術分享

IIS7.0與AP.NET