• ASP.NET System.Web.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>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"就表明了这点.

    3、类的运行机制

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

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

            Web 窗体设计器生成的代码#region Web 窗体设计器生成的代码
            override protected void OnInit(EventArgs e)
            {
                //
                // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
                //
                InitializeComponent();
                base.OnInit(e);
            }
           
            /**//// <summary>
            /// 设计器支持所需的方法 - 不要使用代码编辑器修改
            /// 此方法的内容。
            /// </summary>
            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
    {
        /**//// <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 窗体设计器生成的代码#region Web 窗体设计器生成的代码
            override protected void OnInit(EventArgs e)
            {
                //
                // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
                //
                InitializeComponent();
                base.OnInit(e);
            }
           
            /**//// <summary>
            /// 设计器支持所需的方法 - 不要使用代码编辑器修改
            /// 此方法的内容。
            /// </summary>
            private void InitializeComponent()
            {   
                this.Load += new System.EventHandler(this.Page_Load);

            }
            #endregion
        }
    }
    这样在访问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 窗体设计器生成的代码#region Web 窗体设计器生成的代码
            override protected void OnInit(EventArgs e)
            {
                //
                // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
                //
                InitializeComponent();
                base.OnInit(e);
            }
           
            /**//// <summary>
            /// 设计器支持所需的方法 - 不要使用代码编辑器修改
            /// 此方法的内容。
            /// </summary>
            private void InitializeComponent()
            {   
                this.Load += new System.EventHandler(this.Page_Load);

            }
            #endregion
        }
    }
    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>

  • 相关阅读:
    webpack中如何使用vue
    webpack 4.X 与 Vue 2.X结合
    webpack创建页面的过程
    webpack的css样式文件加载依赖
    webpack-dev-server的执行逻辑
    WebPack命令执行的时候,其内部处理逻辑是什么
    idea for Mac for循环快捷键
    java知识点集锦--基础知识部分
    npm --save-dev --save | -D -S区别
    mysql估算存储数据量
  • 原文地址:https://www.cnblogs.com/cpcpc/p/2123124.html
Copyright © 2020-2023  润新知