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
通过
{
privatevoidPage_Load(objectsender,System.EventArgse)
{
//在此处放置用户代码以初始化页面
}
}
}
而Default.ASPx文件,虽然没有阐明用的哪个类,但是,实际上已经继承自_Default类.
<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.0Transitional//EN">
<HTML>
<HEAD>
<title>Default</title>
<metaname="GENERATOR"Content="MicrosoftVisualStudio.NET7.1">
<metaname="CODE_LANGUAGE"Content="C#">
<metaname="vs_defaultClientScript"content="JavaScript">
<metaname="vs_targetSchema"content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<bodyMS_POSITIONING="GridLayout">
<formid="Form1"method="post"runat="server">
<FONTface="宋体"></FONT>
</form>
</body>
</HTML>
3、类的运行机制
说了这么多,实际上我们还是没有说到System.Web.HttpContext类。但是我们现在说的东西对于System.Web.HttpContext类运用很有帮助。
我们访问了Default.ASPx,那么是只访问Default.ASPx文件,或者该类么?答案当然不是。.Net中当子类被请求时,会先实例化父类。先建立父类的字段,然后是构造函数。
{
privatevoidPage_Load(objectsender,System.EventArgse)
{
//在此处放置用户代码以初始化页面
}
Web窗体设计器生成的代码#regionWeb窗体设计器生成的代码
overrideprotectedvoidOnInit(EventArgse)
{
//
//CODEGEN:该调用是ASP.NETWeb窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/**////<summary>
///设计器支持所需的方法-不要使用代码编辑器修改
///此方法的内容。
///</summary>
privatevoidInitializeComponent()
{
this.Load+=newSystem.EventHandler(this.Page_Load);
}
#endregion
}
在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类。如下:
usingSystem.Web;
namespaceMyTest
{
/**////<summary>
///MyTest的摘要说明。
///</summary>
publicclassMPage:System.Web.UI.Page
{
publicMPage()
{
//
//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类继承该类
usingSystem.Collections;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Web;
usingSystem.Web.SessionState;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.HTMLControls;
namespaceMyTest
{
/**////<summary>
///_Default的摘要说明。
///</summary>
publicclass_Default:MPage
{
privatevoidPage_Load(objectsender,System.EventArgse)
{
//在此处放置用户代码以初始化页面
}
Web窗体设计器生成的代码#regionWeb窗体设计器生成的代码
overrideprotectedvoidOnInit(EventArgse)
{
//
//CODEGEN:该调用是ASP.NETWeb窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/**////<summary>
///设计器支持所需的方法-不要使用代码编辑器修改
///此方法的内容。
///</summary>
privatevoidInitializeComponent()
{
this.Load+=newSystem.EventHandler(this.Page_Load);
}
#endregion
}
}
这样在访问Default.ASPx文件的时候就需要身份验证了。如果已经通过身份验证,而web.config或者dll文件被改动,那么Session会被取消(调试的时候要注意)。
2、Application
快吃饭了,晚上还有点事情,这里就不详细介绍了。如果需要用的朋友可以给我留言,我会解答的。
Application可以这样使用:
usingSystem.Web;
namespaceMyTest
{
/**////<summary>
///MyTest的摘要说明。
///</summary>
publicclassMPage:System.Web.UI.Page
{
publicMPage()
{
//
//TODO:在此处添加构造函数逻辑
//
try
{
if(HttpContext.Current.Application.Count<1)
HttpContext.Current.Application.Add("Title","我的网站");//在Application没有被创建的时候执行
}
catch
{
HttpContext.Current.Response.Redirect("Err.Htm",true);//出现错误,跳转到错误页面
}
}
publicstringMy_Title
{
get
{
returnApplication["Title"].ToString();
}
}
}
}
Default.ASPx.cs继承
usingSystem.Collections;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Web;
usingSystem.Web.SessionState;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.HTMLControls;
namespaceMyTest
{
/**////<summary>
///_Default的摘要说明。
///</summary>
publicclass_Default:MPage
{
privatevoidPage_Load(objectsender,System.EventArgse)
{
//在此处放置用户代码以初始化页面
}
Web窗体设计器生成的代码#regionWeb窗体设计器生成的代码
overrideprotectedvoidOnInit(EventArgse)
{
//
//CODEGEN:该调用是ASP.NETWeb窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/**////<summary>
///设计器支持所需的方法-不要使用代码编辑器修改
///此方法的内容。
///</summary>
privatevoidInitializeComponent()
{
this.Load+=newSystem.EventHandler(this.Page_Load);
}
#endregion
}
}
Default.ASPx 文件使用
<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.0Transitional//EN">
<HTML>
<HEAD>
<title><%=My_Title%></title>
<metaname="GENERATOR"Content="MicrosoftVisualStudio.NET7.1">
<metaname="CODE_LANGUAGE"Content="C#">
<metaname="vs_defaultClientScript"content="JavaScript">
<metaname="vs_targetSchema"content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<bodyMS_POSITIONING="GridLayout">
<formid="Form1"method="post"runat="server">
<FONTface="宋体"></FONT>
</form>
</body>
</HTML>