日期:2014-05-16  浏览次数:20963 次

ASP.NET学习笔记(四)-模板页,HttpHandler,IHttpModule应用
6.模版页
   (1).加入模版页可以是将图片粘贴到网站,最好新建一个文件夹,这样看起来分类较细
   (2).在网站新建项里建立一个建立一个模版页,即.master,加入样式(主标题在div外面写字,可用左右键切换,添加一个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 是(写为绝对路径)

    具体代码如下:

 <add verb="*" path="*.sample" type="MyHttpHandler"/> //这里的type没有引入命名空间,所以就不存在 完整路径,直接是类名
 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Web;

/// <summary>
///MyHttpHandler 的摘要说明
/// </summary>
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("<html>");
        response.Write("<head>");
        response.Write("<title> 这是来MyHandler的相应</title>");
        response.Write("</head>");
        response.Write("<body>");
        response.Write("<h1 style =\"color:red\"> 这是来MyHandler的相应</h1>");
        response.Write("</body");
        response.Write("</html>");
    }
}
    
    在Web.config中:
     <add verb="*" path="*.sample" type="MyHttpHandler"/>

 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;

/// <summary>
///MyHttpMudule 的摘要说明
/// </summary>
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模块