ASP.NET中httpmodules與httphandlers全解析

https://www.cnblogs.com/zpc870921/archive/2012/03/12/2391424.htmlhtml

http://www.javashuo.com/article/p-zhkriyjs-hh.htmlweb

http://www.javashuo.com/article/p-dhxrsxbr-hn.html服務器

一、向每一個頁面動態添加一些備註或說明性的文字:函數

  有的網站每個頁面都會彈出一個廣告或在每一個頁面都以註釋形式(<!-- -->)加入網站的版權信息。若是在每一個頁面教編寫這樣的JS代碼的話,對於大一點的網站,這種JS代碼的編寫與維護但是一個很繁瑣枯燥的工做。網站

  有了HttpModule咱們就能夠很簡單地解決這個問題了。HttpModule是客戶端發出請求到客戶端接收到服務器響應之間的一段必經之 路。咱們徹底能夠在服務器處理完請求以後,並在向客戶端發送響應文本以前這段時機,把這段註釋文字添加到頁面文本以後。這樣,每個頁面請求都會被附加上 這段註釋文字。ui

  這段代碼究竟該在哪一個事件裏實現呢? PostRequestHandlerExecute和PreSendRequestContent之間的任何一個事件均可以,但我比較喜歡在EndRequest事件裏編寫代碼。orm

  第一步:建立一個類庫ClassLibrary831。htm

  第二步:編寫一個類實現IHttpModule接口blog

  class TestModule:IHttpModule接口

  {

  public void Dispose()

  {

  }

  public void Init(HttpApplication context)

  {

  }

  }

  第三步:在Init事件中註冊EndRequest事件,並實現事件處理方法

  class TestModule:IHttpModule

  {

  public void Dispose(){}

  public void Init(HttpApplication context)

  {

  context.EndRequest += new EventHandler(context_EndRequest);

  }

  void context_EndRequest(object sender, EventArgs e)

  {

  HttpApplication ha = (HttpApplication)sender;

  ha.Response.Write("<!--這是每一個頁面都會動態生成的文字。--grayworm-->");

  }

  }

  第四步:在Web.Conofig中註冊一下這個HttpModule模塊

  <httpModules>

  <add name="TestModule" type="ClassLibrary831.TestModule,ClassLibrary831"></add>

  </httpModules>

  name:模塊名稱,通常是類名

  type:有兩部分組成,前半部分是命名空間和類名組成的全名,後半部分是程序集名稱,若是類是直接放在App_Code文件夾中,那程序名稱是App_Code。

  這樣在Web站點是添加該類庫的引用後,運行每一個頁面,會發現其源文件中都會加入「<!--這是每一個頁面都會動態生成的文字。--grayworm-->」這句話。一樣的方法你也能夠在其中加入JS代碼。

  二、身份檢查

  你們在做登陸時,登陸成功後,通常要把用戶名放在Session中保存,在其它每個頁面的Page_Load事件中都檢查Session中是否存在用戶名,若是不存在就說明用戶未登陸,就不讓其訪問其中的內容。

  在比較大的程序中,這種作法實在是太笨拙,由於你幾乎要在每個頁面中都加入檢測Session的代碼,致使難以開發和維護。下面咱們看看如何使用HttpModule來減小咱們的工做量

  因爲在這裏咱們要用到Session中的內容,咱們只能在AcquireRequestState和 PreRequestHandlerExecute事件中編寫代碼,由於在HttpModule中只有這兩事件中能夠訪問Session。這裏咱們選擇 PreRequestHandlerExecute事件編寫代碼。

  第一步:建立一個類庫ClassLibrary831。

  第二步:編寫一個類實現IHttpModule接口

  class TestModule:IHttpModule

  {

  public void Dispose()

  {

  }

  public void Init(HttpApplication context)

  {

  }

  }

  第三步:在Init事件中註冊PreRequestHandlerExecute事件,並實現事件處理方法

  class AuthenticModule:IHttpModule

  {

  public void Dispose(){}

  public void Init(HttpApplication context)

  {

  context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute);

  }

  void context_PreRequestHandlerExecute(object sender, EventArgs e)

  {

  HttpApplication ha = (HttpApplication)sender;

  string path = ha.Context.Request.Url.ToString();

  int n = path.ToLower().IndexOf("Login.aspx");

  if (n == -1) //是不是登陸頁面,不是登陸頁面的話則進入{}

  {

  if (ha.Context.Session["user"] == null) //是否Session中有用戶名,如果空的話,轉向登陸頁。

  {

  ha.Context.Response.Redirect("Login.aspx?source=" + path);

  }

  }

  }

  }

 

 

第四步:在Login.aspx頁面的「登陸」按鈕中加入下面代碼

  protected void Button1_Click(object sender, EventArgs e)

  {

  if(true)    //判斷用戶名密碼是否正確

  {

  if (Request.QueryString["source"] != null)

  {

  string s = Request.QueryString["source"].ToLower().ToString();   //取出從哪一個頁面轉來的

  Session["user"] = txtUID.Text;

  Response.Redirect(s); //轉到用戶想去的頁面

  }

  else

  {

  Response.Redirect("main.aspx");    //默認轉向main.aspx

  }

  }

  }

  第五步:在Web.Conofig中註冊一下這個HttpModule模塊

  <httpModules>

  <add name="TestModule" type="ClassLibrary831.TestModule,ClassLibrary831"></add>

  </httpModules>

  三、多模塊的操做

  若是定義了多個HttpModule,在web.config文件中引入自定義HttpModule的順序就決定了多個自定義HttpModule在處理一個HTTP請求的接管順序。

  HttpHandler

  HttpHandler是HTTP請求的處理中心,真正地對客戶端請求的服務器頁面作出編譯和執行,並將處理事後的信息附加在HTTP請求信息流中再次返回到HttpModule中。

  HttpHandler與HttpModule不一樣,一旦定義了本身的HttpHandler類,那麼它對系統的HttpHandler的關係將是「覆蓋」關係。

  IHttpHandler接口聲明

  public interface IHttpHandler

  {

  bool IsReusable { get; }

  public void ProcessRequest(HttpContext context); //請求處理函數

  }

  示例:把硬盤上的圖片以流的方式寫在頁面上

  class TestHandler : IHttpHandler

  {

  public void ProcessRequest(HttpContext context)

  {

  FileStream fs = new FileStream(context.Server.MapPath("worm.jpg"), FileMode.Open);

  byte[] b = new byte[fs.Length];

  fs.Read(b, 0, (int)fs.Length);

  fs.Close();

  context.Response.OutputStream.Write(b, 0, b.Length);

  }

  public bool IsReusable

  {

  get

  {

  return true;

  }

  }

  }

  Web.Config配置文件

  <httpHandlers>

  <add verb="*" path="*" type="ClassLibrary831.TestHandler,ClassLibrary831"></add>

  </httpHandlers>

  Verb屬性:指定了處理程序支持的HTTP動做。*-支持全部的HTTP動做;「GET」-支持Get操做;「POST」-支持Post操做;「GET, POST」-支持兩種操做。

  Path屬性:指定了須要調用處理程序的路徑和文件名(能夠包含通配符)。「*」、「*.aspx」、「showImage.aspx」、「test1.aspx,test2.aspx」

  Type屬性:用名字空間、類名稱和程序集名稱的組合形式指定處理程序或處理程序工廠的實際類型。ASP.NET運行時首先搜索bin目錄中的DLL,接着在GAC中搜索。

  這樣程序運行的效果是該網站的任何一個頁面都會顯示worm.jpg圖片。如何只讓一個頁面(default21.aspx)執行 HttpHandler中的ProcessRequest方法呢?最簡單的辦法是在Web.Config文件中把path配置信息設爲 default21.aspx。

相關文章
相關標籤/搜索