天天看點

艾偉_轉載:HttpContext類Current屬性 的運用

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>

繼續閱讀