ASP.NET 截獲伺服器生成的將要傳送到客戶端的html的方法

汪磊發表於2013-09-23

有時候我們需要在將伺服器端生成的html傳送帶客戶端之前對這些html進行操作,比如生成靜態html加之儲存、改變生成的html中的某些內容等等,那麼久可以通過如下的方案解決。

我總結了兩種方式,個人覺得比較好用,一種是重寫Page.Render()方法。一種是通過IHttpmodule來實現。

1)這種方法適合控制某個頁面,在.aspx.cs裡面重寫Render()方法即可,該方法提供一個HtmlTextWriter 型別引數,裡面就包含了將要傳送到客戶端的內容,根據asp.net宣告週期知道Render階段是在load事件之後觸發的,所以,這個方法很適合完成我們想要的效果。下面是一個簡單的例子:

   1:      protected override void Render(HtmlTextWriter writer)
   2:      {
   3:          TextWriter tempWriter = new StringWriter();
   4:          base.Render(new HtmlTextWriter(tempWriter));
   5:          string str = tempWriter.ToString(); //這個str裡面已經包含了html。
   6:   
   7:         //然後可以對這個字串進行處理,比如儲存、替換等等
   8:          writer.Write(str); //再將修改好的html傳送到客戶端
   9:      }

2)這種方法在應用級控制,更適合需要對某一類頁面進行處理,或者所有頁面比較方面。要註冊介面的PreSendRequestContent方法,下面為一個例子,有關IHttpmodule內容,本文不重複了:

   1:          void context_PreSendRequestContent(object sender, EventArgs e)
   2:          {
   3:              HttpApplication app = (HttpApplication)sender;
   4:              HttpContext context = app.Context;
   5:              string url = context.Request.RawUrl;
   6:              StringWriter wr = new StringWriter();
   7:              context.Server.Execute(url, wr);
   8:              string htmlCon = wr.ToString();//字串htmlCon 已經包含了將要傳送到客戶端的html。
   9:   
  10:          }

3) 通過替換Response.Filter也可以實現。

相關文章