close

http://www.cnblogs.com/basibasi/archive/2008/02/16/1070892.html

(英)經典之作A low-level Look at the ASP.NET Architecture

http://www.west-wind.com/presentations/howaspnetworks/howaspnetworks.asp

(英)HTTP Handlers and HTTP Modules in ASP.NET
http://www.15seconds.com/Issue/020417.htm

(中 蔡學庸)http://61.219.235.182:101/taiwan/msdn/books/ataglance/SecNetAP04.htm

web.config中的HttpContext, HttpModules HttpHandlers

HttpApplication觸發事件來通知你的程式有事發生,以此來負責請求流轉.這作為HttpApplication.Init()函數的一部分發生(Reflector查看System.Web.HttpApplication.InitInternal()方法和HttpApplication.ResumeSteps()方法來瞭解更多詳情),連續設置並啟動一系列事件,包括執行所有的處理器(handler).這些事件處理器映射到global.asax中自動生成的哪些事件中,同時它們也映射到所有附加的HttpModule(它們本質上是HttpApplication對外發佈的額外的事件接收器(sink)).

  HttpModuleHttpHandler兩者都是根據Web.config中對應的配置被動態載入並附加到事件處理鏈中.HttpModule實際上是事件處理器,附加到特殊的HttpApplication事件上,然而HttpHandler是用來處理應用級請求處理的終點.

  HttpModuleHttpHandler兩者都是在HttpApplication.Init()函數調用的一部分中被載入並附加到調用鏈上.

HttpContext, HttpModules HttpHandlers

  httpApplication它本身對發送給應用程式的資料一無所知-它只是一個通過事件來通訊的消息物件.它觸發事件並通過HttpContext物件來向被調用函數傳遞消息.實際的當前請求的狀態資料由前面提到的HttpContext物件維護.它提供了所有請求專有的資料並從進入管道開始到結束一直跟隨請求.7顯示了ASP.NET管道中的流程.注意上下文物件(HttpContext),這個從請求開始到結束一直都是你朋友的物件,可以在一個事件處理函數中保存資訊並在以後的事件處理函數中取出.

  一旦管道被啟動,HttpApplication開始象圖六那樣一個個的觸發事件.每個事件處理器被觸發,如果事件被掛接,這些處理器將執行它們自己的任務.這個處理的主要任務是最終調用掛接到此特定請求的HttpHandler.處理器(handler)ASP.NET請求的核心處理機制,通常也是所有應用程式級別的代碼被執行的地方.記住ASP.NET頁面和Web服務框架都是作為HttpHandler實現,這裏也是處理請求的的核心之處.模組(module)趨向于成為一個傳遞給處理器(handler)的上下文的預處理或後處理器.ASP.NET中典型的默認處理器包括預處理的認證,緩存以及後處理中各種不同的編碼機制.

  有很多關於HttpHandlerHttpModule的可用資訊,所以為了保持這篇文章在一個合理的長度,我將提供一個關於處理器的概要介紹.

  HttpModule

  當請求在管道中傳遞時,HttpApplicaion物件中一系列的事件被觸發.我們已經看到這些事件在Global.asax中作為事件被發佈.這種方法是特定于應用程式的,可能並不總是你想要的.如果你要建立一個通用的可用被插入任何Web應用程式的HttpApplication事件鉤子,你可用使用HttpModule,這是可複用的,不需要特定語應用程式碼的,只需要web.config中的一個條目.

  模組本質上是篩檢程式(fliter)-功能上類似於ISAPI篩檢程式,但是它工作在ASP.NET請求級別上.模組允許為每個通過HttpApplication物件的請求掛接事件.這些模組作為外部程式集中的類存貯.,web.config檔中被配置,在應用程式啟動時被載入.通過實現特定的介面和方法,模組被掛接到HttpApplication事件鏈上.多個HttpModule可用被掛接在相同的事件上,事件處理的順序取決於它們在Web.config中聲明的順序.下麵是在Web.config中處理器定義.

configuration
system.web
httpModules
add name= "BasicAuthModule"
type="HttpHandlers.BasicAuth,WebStore" /

/httpModules
/system.web
/configuration


  注意你需要指定完整的類型名和不帶dll副檔名的程式集名.

  模組允許你查看每個收到的Web請求並基於被觸發的事件執行一個動作.模組在修改請求和回應資料方面做的非常優秀,可用為特定的程式提供自定義認證或者為發生在ASP.NET中的每個請求增加其他預處理/後處理功能.許多ASP.NET的功能,像認證和會話(Session)引擎都是作為HttpModule來實現的.

  雖然HttpModule看上去很像ISAPI篩檢程式,它們都檢查每個通過ASP.NET應用的請求,但是它們只檢查映射到單個特定的ASP.NET應用或虛擬目錄的請求,也就是只能檢查映射到ASP.NET的請求.這樣你可以檢查所有ASPX頁面或者其他任何映射到ASP.NET的副檔名.你不能檢查標準的.HTM或者圖片檔,除非你顯式的映射這些副檔名到ASP.NET ISAPI dll,就像圖1中展示的那樣.一個常見的此類應用可能是使用模組來過濾特定目錄中的JPG圖像內容並在最上層通過GDI+來繪製樣品字樣.

  實現一個HTTP模組是非常簡單的:你必須實現之包含兩個函數(Init()Dispose())IHttpModule介面.傳進來的事件參數中包含指向HTTPApplication物件的引用,這給了你訪問HttpContext對象的能力.在這些方法上你可以掛接到HttpApplication事件上.例如,如果你想掛接AuthenticateRequest事件到一個模組上,你只需像列表5中展示的那樣做

  列表5:基礎的HTTP模組是非常容易實現的

public class BasicAuthCustomModule : IHttpModule
{
 public void Init(HttpApplication application)
 {
  // *** Hook up any HttpApplication events
  application.AuthenticateRequest += new EventHandler(this.OnAuthenticateRequest);
 }
 public void Dispose() { }

 public void OnAuthenticateRequest(object source, EventArgs eventArgs)
 {
  HttpApplication app = (HttpApplication) source;
  HttpContext Context = HttpContext.Current;
  … do what you have to do… }
 }


  記住你的模組訪問了HttpContext物件,從這裏可以訪問到其他ASP.NET管道中固有的物件,如請求(Request)和回應(Response),這樣你還可以接收用戶輸入的資訊等等.但是記住有些東西可能是不能訪問的,它們只有在處理鏈的後段才能被訪問.

  你可以在Init()方法中掛接多個事件,這樣你可以在一個模組中實現多個不同的功能.然而,將不同的邏輯分到單獨的類中可能會更清楚的將模組進行模組化(譯注:這裏的模組化和前面的模組沒有什麼關係)在很多情況下你實現的功能可能需要你掛接多個事件-例如一個日誌篩檢程式可能在BeginRequest事件中記錄請求開始時間,然後在EndRequest事件中將請求結束寫入到日誌中.

  注意一個HttoModuleHttpApplication事件中的重點:Response.End()HttpApplication.CompleteRequest()會在HttpApplicationModule的事件鏈中抄近道”.注意Response.End()”來獲得更多資訊.

  注意Response.End()

  當創建HttpModule或者在Global.asax中實現事件鉤子的時候,當你調用Response.End Appplication.CompleteRequest的時候要特別注意.這兩個函數都結束當前請求並停止觸發在HTTP管道中後續的事件,然後發生將控制返回到Web伺服器中.當你在處理鏈的後面有諸如記錄日誌或對內容進行操作的行為時,因為他們沒有被觸發,有可能使你上當.例如,samplelogging的例子就會失敗,因為如果調用Response.End()的話,EndRequest事件並不會被觸發.

 

 

arrow
arrow
    全站熱搜

    sophieProfession 發表在 痞客邦 留言(0) 人氣()