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中當子類被請求時,會先執行個體化父類。先建立父類的字段,然後是構造函數。
Web 窗體設計器生成的代碼#region Web 窗體設計器生成的代碼
override protected void OnInit(EventArgs e)
//
// CODEGEN: 該調用是 ASP.NET Web 窗體設計器所必需的。
InitializeComponent();
base.OnInit(e);
/**////
/// 設計器支援所需的方法 - 不要使用代碼編輯器修改
/// 此方法的内容。
///
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
#endregion
從上面的類中可以看出,該類沒有字段,也沒有構造函數。執行個體化它又得先執行個體化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
{
/**////
/// 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驗證不通過,那麼跳轉到登陸頁.
然後在Default.ASPx.cs檔案中_Default類繼承該類
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HTMLControls;
/// _Default 的摘要說明。
public class _Default : MPage
這樣在通路Default.ASPx檔案的時候就需要身份驗證了。如果已經通過身份驗證,而web.config或者dll檔案被改動,那麼Session會被取消(調試的時候要注意)。
2、Application
快吃飯了,晚上還有點事情,這裡就不詳細介紹了。如果需要用的朋友可以給我留言,我會解答的。
Application可以這樣使用:
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繼承
Default.ASPx 檔案使用
        <title><% = My_Title %>title>