ASP.NET System.Web.HttpContext类Current属性

1、.NET的HTTP请求

.NETASP的运行机制有很大不同.

ASP的请求与响应是,ASP页面被请求,然后逐行解释.是基于过程的.最多是包含了文件,需要先引入文件罢了.

.NET,在页面被请求后,首先是加载HTTP Module,这不是本文的重点.然后再加载HTTP Handler.这也不是本文的重点.加载的这两项,都需要在Webconfig文件中配置.大家知道的URL转址就是这么实现的.在完成这些之后才开始给出响应的页面.

在给出响应页面的工作中,.NET就表现出和ASP的最大区别来..Net是面向对象的语言,是基于类的语言.没有类很难写出有意义的.Net程序.如果写出来,也就是个ASP的翻版.

2、.NET中基本文件结构(继承关系)
首先大家看到无论在1.1还是2.0中,用VS创建的网站每个ASPx文件都对应一个cs文件(或者vb等其它语言).而cs文件里的类一般和文件同名,如果遇见关键字的情况才会自动使类名前加个'_',例如:_Default.创建的这个cs文件继承自System.Web.UI.Page类,而且只能\必须继承该类.原因就是aspx文件是继承cs文件的.

就拿Default.ASPx,Default.aspx.cs文件来说.
Default.ASPx.cs里包含了类 _Default,继承字System.Web.UI.Page
通过

     public   class  _Default : System.Web.UI.Page
    
{
        
private void Page_Load(object sender, System.EventArgs e)
        
{
            
// 在此处放置用户代码以初始化页面
        }

    }

}
就能看得出来.
而Default. ASPx文件,虽然没有阐明用的哪个类,但是,实际上已经继承自_Default类.
<% @ Page language = " c# "  Codebehind = " Default.ASPx.cs "  AutoEventWireup = " false "  Inherits = " MyTest._Default "   %>
<! DOCTYPE HTML PUBLIC  " -//W3C//DTD HTML 4.0 Transitional//EN "   >
< HTML >
    
< HEAD >
        
< title > Default </ title >
        
< meta name = " GENERATOR "  Content = " Microsoft Visual Studio .NET 7.1 " >
        
< meta name = " CODE_LANGUAGE "  Content = " C# " >
        
< meta name = " vs_defaultClientScript "  content = " JavaScript " >
        
< meta name = " vs_targetSchema "  content = " http://schemas.microsoft.com/intellisense/ie5 " >
    
</ HEAD >
    
< body MS_POSITIONING = " GridLayout " >
        
< form id = " Form1 "  method = " post "  runat = " server " >
            
< FONT face = " 宋体 " ></ FONT >
        
</ form >
    
</ body >
</ HTML >
以上代码第一句话最后Inherits="MyTest._Default"就表明了这点.这个文件我是以VS2003建立的,也就是 .NET1.1,MyTest是我用的命名空间。

3、类的运行机制
说了这么多,实际上我们还是没有说到System.Web.HttpContext类。但是我们现在说的东西对于System.Web.HttpContext类运用很有帮助。

我们访问了Default. ASPx,那么是只访问Default.aspx文件,或者该类么?答案当然不是。 .NET中当子类被请求时,会先实例化父类。先建立父类的字段,然后是构造函数。

     public   class  _Default : System.Web.UI.Page
    
{
        
private void Page_Load(object sender, System.EventArgs e)
        
{
            
// 在此处放置用户代码以初始化页面
        }


        
Web 窗体设计器生成的代码
    }
从上面的类中可以看出,该类没有字段,也没有构造函数。实例化它又得先实例化System.Web.UI.Page类。System.Web.UI.Page类不是本文要讨论的。在实例化_Default类的时候首先执行的是OnInit方法。它重写了System.Web.UI.Page.OnInit。然后调用InitializeComponent方法,而InitializeComponent方法又调用了Load事件,执行了Page_Load方法。

在Page_Load方法被执行之前,System.Web.UI.Page类的很多对象是不能使用的,比如:Application,Session等。

4、System.Web.HttpContext类Current属性 的运用
终于说到本文的重点了,可能这部分也不会说很多,但是上面说的确实是为这里服务的。

也不多说了,太长的文章一般没人看,何况我写的比较肤浅,并且不够精彩。在这里就举两个例子。一个是身份验证问题(Session),还有个是全局会话(Application)。

1)、Session
用户登陆后一般要通过Cookice或者Session来控制权限等。但是通过使用一个控件(比如ascx)又觉得不够好。那么,这个时候System.Web.HttpContext.Current就能发挥作用了。

比如,你可以让所有的需要身份验证的页面都继承自MPage类。如下:
using  System;
using  System.Web;

namespace  MyTest
{
    
/// <summary>
    
/// MyTest 的摘要说明。
    
/// </summary>

    public class MPage : System.Web.UI.Page
    
{
        
public MPage()
        
{
            
//
            
// TODO: 在此处添加构造函数逻辑
            
//
            if(HttpContext.Current.Session["MySession"]==null || HttpContext.Current.Session["MySession"]==String.Empty)
                HttpContext.Current.Response.Redirect(
"login.ASPx",true);    //如果Session验证不通过,那么跳转到登陆页.

        }

    }

}

然后在Default. ASPx.cs文件中_Default类继承该类
using  System;
using  System.Collections;
using  System.ComponentModel;
using  System.Data;
using  System.Drawing;
using  System.Web;
using  System.Web.SessionState;
using  System.Web.UI;
using  System.Web.UI.WebControls;
using  System.Web.UI.HTMLControls;

namespace  MyTest
{
    
/// <summary>
    
/// _Default 的摘要说明。
    
/// </summary>

    public class _Default : MPage
    
{
        
private void Page_Load(object sender, System.EventArgs e)
        
{
            
// 在此处放置用户代码以初始化页面
        }


        
Web 窗体设计器生成的代码
    }

}

这样在访问Default. ASPx文件的时候就需要身份验证了。如果已经通过身份验证,而web.config或者dll文件被改动,那么Session会被取消(调试的时候要注意)。

2、Application
快吃饭了,晚上还有点事情,这里就不详细介绍了。如果需要用的朋友可以给我留言,我会解答的。

Application可以这样使用:
using  System;
using  System.Web;

namespace  MyTest
{
    
/// <summary>
    
/// MyTest 的摘要说明。
    
/// </summary>

    public class MPage : System.Web.UI.Page
    
{
        
public MPage()
        
{
            
//
            
// TODO: 在此处添加构造函数逻辑
            
//
            try
            
{
                
if(HttpContext.Current.Application.Count<1)
                    HttpContext.Current.Application.Add(
"Title","我的网站");    //在Application没有被创建的时候执行
            }

            
catch
            
{
                HttpContext.Current.Response.Redirect(
"Err.Htm",true);    //出现错误,跳转到错误页面
            }

        }


        
public string My_Title
        
{
            
get
            
{
                
return Application["Title"].ToString();
            }

        }

    }

}

Default. ASPx.cs继承
using  System;
using  System.Collections;
using  System.ComponentModel;
using  System.Data;
using  System.Drawing;
using  System.Web;
using  System.Web.SessionState;
using  System.Web.UI;
using  System.Web.UI.WebControls;
using  System.Web.UI.HTMLControls;

namespace  MyTest
{
    
/// <summary>
    
/// _Default 的摘要说明。
    
/// </summary>

    public class _Default : MPage
    
{
        
private void Page_Load(object sender, System.EventArgs e)
        
{
            
// 在此处放置用户代码以初始化页面
        }


        
Web 窗体设计器生成的代码
    }

}

Default. ASPx 文件使用
<% @ Page language = " c# "  Codebehind = " Default.ASPx.cs "  AutoEventWireup = " false "  Inherits = " MyTest._Default "   %>
<! DOCTYPE HTML PUBLIC  " -//W3C//DTD HTML 4.0 Transitional//EN "   >
< HTML >
    
< HEAD >
        
< title ><%   =  My_Title  %></ title >
        
< meta name = " GENERATOR "  Content = " Microsoft Visual Studio .NET 7.1 " >
        
< meta name = " CODE_LANGUAGE "  Content = " C# " >
        
< meta name = " vs_defaultClientScript "  content = " JavaScript " >
        
< meta name = " vs_targetSchema "  content = " http://schemas.microsoft.com/intellisense/ie5 " >
    
</ HEAD >
    
< body MS_POSITIONING = " GridLayout " >
        
< form id = " Form1 "  method = " post "  runat = " server " >
            
< FONT face = " 宋体 " ></ FONT >
        
</ form >
    
</ body >
</ HTML >

你可能感兴趣的:(asp.net)