熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ASP.NET內部原理

2013-11-13 10:03:18  來源: .NET編程 

  在以前的ASP時候當請求一個*asp頁面文件的時候這個HTTP請求首先會被一個名為inetinfoexe進程所截獲這個進程實際上就是www服務截獲之後它會將這個請求轉交給aspdll進程這個進程就會解釋這個asp頁面然後將解釋後的數據流返回給客戶端浏覽器其實ASPDLL是一個依附在IIS的ISAPI文件它負責了對諸如ASP文件ASA等文件的解釋執行

  -------------------------------------

  ASPNET的HTTP請求處理方法

  當客戶端向web服務器請求一個*aspx的頁面文件時同asp類似這個http請求也會被inetinfoexe進程截獲(www服務)它判斷文件後綴之後把這個請求轉交給ASPNET_ISAPIDLL而ASPNET_ISAPIDLL則會通過一個Http PipeLine的管道將這個http請求發送給ASPNET_WPEXE進程當這個HTTP請求進入ASPNET_WPEXE進程之後 framework就會通過HttpRuntime來處理這個Http請求處理完畢後將結果返回給客戶端

  ------------------------------------

  當一個http請求被送入到HttpRuntime之後這個Http請求會繼續被送入到一個被稱之為HttpApplication Factory的一個容器當中而這個容器會給出一個HttpApplication實例來處理傳遞進來的http請求而後這個Http請求會依次進入到如下幾個容器中

  當系統內部的HttpHandler的ProcessRequest方法處理完畢之後整個Http Request就被處理完成了客戶端也就得到相應的東東了

  完整的http請求在 framework中的處理流程

  如果想在中途截獲一個httpRequest並做些自己的處理就應該在HttpRuntime運行時內部來做到這一點確切的說時在HttpModule這個容器中做到這個的

  ----------------------------------------

  系統本身的HttpModule實現一個IHttpModule的接口當然我們自己的類也能夠實現IHttpModule接口這就可以替代系統的HttpModule對象了

  系統中默認的HttpModule

  DefaultAuthenticationModule 確保上下文中存在 Authentication 對象無法繼承此類

  FileAuthorizationModule 驗證遠程用戶是否具有訪問所請求文件的 NT 權限無法繼承此類

  FormsAuthenticationModule 啟用 ASPNET 應用程序以使用 Forms 身份驗證無法繼承此類

  PassportAuthenticationModule 提供環繞 PassportAuthentication 服務的包裝無法繼承此類

  SessionStateModule   為應用程序提供會話狀態服務

  UrlAuthorizationModule   提供基於 URL 的授權服務以允許或拒絕對指定資源的訪問無法繼承此類

  WindowsAuthenticationModule 啟用 ASPNET 應用程序以使用 Windows/IIS 身份驗證無法繼承此類

  --------------------------------------

  這些系統默認的HttpModule是在文件nfig中配置的和我們開發時使用到的nfig的關系是是在ASPNET FRAMEWORK啟動處理一個Http Request的時候它會依次加載nfig和請求頁面所在目錄的nfig文件如果在machine中配置了一個自己的HttpModule你仍然可以在所在頁面的nfig文件中remove掉這個映射關系

  深入HttpModule

  public class HelloWorldModule : IHttpModule
{
    public HelloWorldModule()
    {
    }

    public String ModuleName
    {
        get { return HelloWorldModule; }
    }

    // In the Init function register for HttpApplication 
    // events by adding your handlers
    public void Init(HttpApplication application)
    {
        applicationBeginRequest += 
            (new EventHandler(thisApplication_BeginRequest));
        applicationEndRequest += 
            (new EventHandler(thisApplication_EndRequest));
    }

    private void Application_BeginRequest(Object source 
         EventArgs e)
    {
    // Create HttpApplication and HttpContext objects to access
    // request and response properties
        HttpApplication application = (HttpApplication)source;
        HttpContext context = applicationContext;
        contextResponseWrite(

 HelloWorldModule: Beginning of Request


  );
    }

    private void Application_EndRequest(Object source EventArgs e)
    {
        HttpApplication application = (HttpApplication)source;
        HttpContext context = applicationContext;
        contextResponseWrite(


HelloWorldModule: End of Request

  );
    }

    public void Dispose()
    {
    }
}

  一個Http請求在被ASPNET Framework捕獲之後會依次交給HttpModule以及HttpHandler來處理hm與hh之間不是完全獨立的實際上http請求在hm傳遞的過程中會在某個事件內將控制權轉交給hh的而真正的處理在HttpHandler中執行完成後HttpHandler會再次將控制權交還給hh的而真正的處理在HttpHandler中執行完成後HttpHandler會再次將控制權交還給HttpModule
  上面的代碼中的HttpModule的Init()中的參數是HttpApplication類型它具有許多事件包括BeginRequestEndRequestAuthentiacteRequest 等等

IHttpHandler

  它是 Framework提供的一個接口定義了如果要實現一個Http請求的處理所需要必須實現的一些系統約定也就是說如果你想要自行處理某些類型的HTTP請求信息流的話你需要實現這些系統約定才能做到譬如一個*aspx文件用來處理此類型的Http請求ASPNET FRAMEWORK將會交給一個名為SystemWebUIPageHandlerFactory的HttpHandler類來處理

  HH和HM一樣系統會在最初始由ASPNET FRAMEWORK首先加載nfig中的HttpHandler而後會加載Web應用程序所在目錄的nfig中的用戶自定義的HttpHandler類但是系統與我們自定義的HH之間的關系是覆蓋也就是說如果我們自定義了一個針對*aspx的HttpHandler類的話那麼系統會將對此http請求的處理權完全交給我們自己定義的這個HttpHandler類來處理而我們自己的HttpHandler類則需要自己完全解析這個Http請求並作出處理

  接口中最重要的方法ProcessRequest這個方法就是HttpHandler用來處理一個Http請求當一個Http請求經過由HttpModule容器傳遞到HttpHandler容器中的時候framework會調用HttpHandler的ProcessRequest方法來做對這個Http請求做真正的處理

  framework實際上並不是直接把相關頁面的HTTP請求定位到一個內部默認的IHttpHandler容器之上的而是定位到了其 內部默認的IHttpHandler Factory上了IHttpHandler Factory的作用就是對很多系統已經實現了的IHttpHandler容器進行調度和管理的這樣做的優點是大大增強了系統的負荷性提升了效率


From:http://tw.wingwit.com/Article/program/net/201311/12413.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.