ASP.NET學習筆記(四)-模板頁,HttpHandler,IHttpModule應用

6.模版頁
   (1).加入模版頁可以是將圖片粘貼到網站,最好新建一個文件夾,這樣看起來分類較細
   (2).在網站新建項裡建立一個建立一個模版頁,即.master,加入樣式(主標題在p外面寫字,可用左右鍵切換,添加一個Image控件,將ImageUrl選為內連的圖片,最好樣式的長寬住設計視圖裡搞好,不然就得用相應的 td的 width ="15%" bordergrouder-color="Grey" 或:style=" width:100px; bordergrouder-color:50%" 來改,)
   (3).修改本來繼承其他網頁模版的代碼:
   
     protected void Page_PreInit(object sender, EventArgs e)
    {
        this.MasterPageFile = "~/MasterPage2.master";
    }

7.HttpHandler的使用
    (1). 在ProcessRequest 事件中寫反饋頁面
    (2).在Config的System.web下的Httphandler 下add自己的 verb, path寫被訪問的後綴名 (隨便寫), type 是(寫為絕對路徑)

    具體代碼如下:

  //這裡的type沒有引入命名空間,所以就不存在 完整路徑,直接是類名
 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Web;

/// 
///MyHttpHandler 的摘要說明
/// 
public class MyHttpHandler:IHttpHandler  //記住是IHttpHandler ,不是IHttpAnyHandler。。。。。。
{
    public MyHttpHandler()
    {
        //
        //TODO: 在此處添加構造函數邏輯
        //
    }


    public bool IsReusable
    {
        get { return false; }
    }

    public void ProcessRequest(HttpContext context) //這是一個返回請求的頁面,依然用HttpResponse 的實例去Write網頁..........
    {
        //對於錯誤報告等返回很有效,也可以作為Session的驗證。。。不反饋前臺.............
        //也可以返回與前臺頁面相同的頁面,不過要write包的麻煩些
        記住是在這個事件裡寫
        HttpResponse response = context.Response;
        response.Write("");
        response.Write("");
        response.Write(" 這是來MyHandler的相應");
        response.Write("");
        response.Write("");
        response.Write("

這是來MyHandler的相應

"); response.Write("</body"); response.Write(""); } } 在Web.config中: 8.Http模塊的IHttpModule類的使用(類模塊,類似與模版類模版) (1).一般的方法是繼承的IHttpModule,裡面有Begin 的require 即在客戶端的Http請求具體頁面發過來的之前,就先請求該模塊的事件,類似的類方法還有End require,即在最後的請求中才請求該模塊的信息(一般放的是頁腳的版權信息,每頁必有) (2).該類的事件都是在HTML的頁面之外的情況... (3).在Inti裡寫初始化,連續兩次按tab鍵,出方法 using System; using System.Collections.Generic; using System.Linq; using System.Web; /// ///MyHttpMudule 的摘要說明 /// public class MyHttpMudule:IHttpModule { public MyHttpMudule() { // //TODO: 在此處添加構造函數邏輯 // } public void Dispose() { return; } public void Init(HttpApplication context) { context.BeginRequest += new EventHandler(context_BeginRequest); //連續按兩次Tab鍵出下面的方法 context.EndRequest += new EventHandler(context_EndRequest); context.AcquireRequestState += new EventHandler(context_AcquireRequestState); } /* void context_AcquireRequestState(object sender, EventArgs e) { HttpApplication application = sender as HttpApplication; System.Web.SessionState.HttpSessionState session = application.Session; //獲取Session if (null == session["username"]) { HttpResponse response = application.Response; response.Redirect("~/UserLogin.aspx"); response.Redirect("~/UserLogin.aspx/"); //導向到新的頁面去,用response.Redirect 重定向 但是這裡會造成死循環,因為每個頁面都會重復進行Session的驗證,由於Session裡為空,所以會跳回自己 response.Redirect("~/UserLogin.aspx"); application.Server.Transfer("~/UserLogin.aspx");//解決的辦法代替 response.Redirect("~/UserLogin.aspx"); //這裡直接請求UserLogin.aspx,而不經過Session模塊 }*/ //或者在之前判斷一下是否是UserLogin.aspx頁面,如果是,就不需判斷,直接返回 void context_AcquireRequestState(object sender, EventArgs e) { HttpApplication application = sender as HttpApplication; string filepath = application.Request.FilePath;//返回請求的文件路徑 string FileName = VirtualPathUtility.GetFileName(filepath);//返回文件的最後的完整文件名 if (FileName == "UserLogin.aspx") return; //導向到新的頁面去,用response.Redirect 重定向,跳轉到新的頁面 System.Web.SessionState.HttpSessionState session = application.Session; //獲取Session if (null == session["username"]) { HttpResponse response = application.Response; response.Redirect("~/UserLogin.aspx"); /* response.Redirect("~/UserLogin.aspx/"); //導向到新的頁面去,用response.Redirect 重定向 但是這裡會造成死循環,因為每個頁面都會重復進行Session的驗證,由於Session裡為空,所以會跳回自己 response.Redirect("~/UserLogin.aspx"); application.Server.Transfer("~/UserLogin.aspx");//解決的辦法代替 response.Redirect("~/UserLogin.aspx"); * 在後綴名不變的情況下直接顯示轉移網頁的內容,該方法不會再次模擬提交的客戶端,所以不會再次經過Http模塊,該模塊可以隨時的進行加刪,所以很方便,這是單點登錄的很好技巧 */ //或者在之前判斷一下是否是UserLogin.aspx頁面,如果是,就不需判斷,直接返回 } } void context_EndRequest(object sender, EventArgs e) { HttpApplication application = sender as HttpApplication; HttpResponse response = application.Response; response.Write("

這是一個來自HTTP模塊的版權信息

");//通過源碼可以看出,是在html的題尾 } void context_BeginRequest(object sender, EventArgs e)//這是在未請求default 頁面之前進行的,即所有頁面都會有的東西,但是要在config中的httphandler裡註冊,所以可以使用這個作為session。。。。。。全局網站驗證 { HttpApplication applicition = sender as HttpApplication; HttpResponse response = applicition.Response; response.Write("

這是一個來自HTTP模塊的題頭

");//通過源碼可以看出,是在所有html最前面 } }

發佈留言