当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > ASP.NET教程:HttpContext类Current属性

ASP.NET
赫赫大名的A*寻路算法(vb.net版本)
asp.net(c#)下Jmai去说明 使用与下载
[原创]完美解决Could not load file or assembly ''AjaxPro.2'' or one of its dependencies. 拒绝访问。
asp.net下gridview 批量删除的实现方法
用CSS实现图片倾斜 只支持IE
.net get set用法小结
vs 不显示行号的操作方法
ASP.NET页面进行GZIP压缩优化的几款压缩模块的使用简介及应用测试!(附源码)
ASP.Net不执行问题一解
asp.net 无限分类
让VS2008对JQuery语法的智能感知更完美一点
扩展方法ToJSON() and ParseJSON()
asp.net下PageMethods使用技巧
Linq to SQL Delete时遇到问题的解决方法
实现ASP.NET多文件上传程序代码
ASP.NET AJAX 1.0 RC开发10分钟图解
asp.net get set用法
ASP.NET下使用WScript.Shell执行命令
asp.net2.0实现邮件发送(测试成功)
Asp.net 无限级分类实例代码

ASP.NET教程:HttpContext类Current属性


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-28   浏览: 65 ::
收藏到网摘: n/a

1、.Net的HTTP请求

.NET与ASP的运行机制有很大不同.

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>Defaulttitle>
        
<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类。如下:

然后在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
{
    
/// 
    
/// _Default 的摘要说明。
    
/// 

    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
{
    
/// 
    
/// MyTest 的摘要说明。
    
/// 

    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
{
    
/// 
    
/// _Default 的摘要说明。
    
/// 

    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>

using System;
using System.Web;

namespace MyTest
{
    
/// 
    
/// MyTest 的摘要说明。
    
/// 

    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验证不通过,那么跳转到登陆页.

        }

    }

}