• 【C#.NET】ASP.NET状态管理之三:Application


    一、 全局应用程序类

    Application这个单词上大致可以看出Application状态是整个应用程序全局的。在ASP时代我们通常会在Application中存储一些公共数据,而ASP.NETApplication的基本意义没有变:在服务器内存中存储数量较少又独立于用户请求的数据。由于它的访问速度非常快而且只要应用程序不停止,数据一直存在,我们通常在Application_Start的时候去初始化一些数据,在以后的访问中可以迅速访问和检索。

    我们可以来实践一下。首先,右键单击网站,选择“添加新项”命令,如图3-1所示,选择全局应用程序类。

    图3-1 添加一个Global.asax

    Global.asax(通常我们不改名)是一个用来处理应用程序全局的事件。打开文件,系统已经为我们定义了一些事件的处理方法。

    <script runat="server">

        void Application_Start(object sender, EventArgs e)

        {

            // 在应用程序启动时运行的代码

        }   

        void Application_End(object sender, EventArgs e)

        {

            // 在应用程序关闭时运行的代码

        }       

        void Application_Error(object sender, EventArgs e)

        {

            // 在出现未处理的错误时运行的代码

        }

        void Session_Start(object sender, EventArgs e)

        {

            // 在新会话启动时运行的代码

        }

        void Session_End(object sender, EventArgs e)

        {

            // 在会话结束时运行的代码

            // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为InProc 时,才会引发 Session_

               End 事件

            // 如果会话模式设置为 StateServer SQLServer,则不会引发该事件

        }

    </script>

    通过这些注释我们可以看到,这些事件是整个应用程序的事件,和某一个页面没有关系。



     

    二、使用Application统计网站访问

    假设我们希望使用Application统计网站的访问情况。

    ·      页面单击数。页面被单击一次+1,不管是否是同一个用户多次单击页面。

    ·      用户访问数。来了一个用户+1,一个用户打开多个页面不会影响这个数字。

    我们首先需要在Application_Start中去初始化两个变量。

    void Application_Start(object sender, EventArgs e)

    {

        // 在应用程序启动时运行的代码

        Application["PageClick"]=0;

        Application["UserVisit"]=0;

    }

    用户访问数根据Session来判断,因此可以在Session_Start的时候去增加这个变量:

    void Session_Start(object sender, EventArgs e)

    {

        Application.Lock();

        Application["UserVisit"]=(int)Application["UserVisit"]+1;

        Application.UnLock();

    }

    我们看到,Application的使用方法和Session差不多。唯一要注意的是,Application的作用范围是整个应用程序,可能有很多用户在同一个时间访问Application造成并发混乱,因此在修改Application的时候需要先锁定Application,修改完成后再解锁。

    页面单击数则在页面Page_Load的时候去修改。

    protected void Page_Load(object sender, EventArgs e)

    {

        if (!IsPostBack)

        {

            Application.Lock();

            Application["PageClick"] = (int)Application["PageClick"] + 1;

            Application.UnLock();

            Response.Write(string.Format("页面单击数:{0}<br/>", Application["PageClick"]));

            Response.Write(string.Format("用户访问数:{0}<br/>", Application["UserVisit"]));

        }

    }

    由于在应用程序开始的时候我们已经为两个变量初始化了,所以在这里可以直接使用。首次执行效果如图3-2所示。

    连续刷新页面几次,效果如图3-3所示。

    使用Ctrl+N组合键打开几个页面,可以发现用户访问数还是没有变化。前一节中介绍过,Session是每个客户端一份,而不是每个浏览器一份。

    关闭页面,再重新打开。由于前一个用户的Session还没有超时,所以这次用户访问数增加了1,如图3-4所示。



    3-2  使用Application
    进行站点统计



    3-3  页面单击数随着
    页面刷新增长




    3-4 Session_Start导致
    用户访问数增长

     

    我们知道,Visual Studio 2005有一个内置的服务器(不依赖IIS)。因此,我们不能通过IIS来重新启动应用程序。如图3-5所示。

    单击“停止”选项,然后重新打开页面,如图3-6所示,我们可以看到两个变量都重新初始化了。

            

         3-5  停止IDE内置的Web服务器     3-6  重新启动Web服务器导致Application_Start触发


     

    三、Application总结

    ASP.NET 2.0中,Application已经变得不是非常重要了。因为Application的自我管理功能非常薄弱,它没有类似Session的超时机制。也就是说,Application中的数据只有通过手动删除或者修改才能释放内存,只要应用程序不停止,Application中的内容就不会消失。在下一节中,我们会看到,可以使用Cache实现类似Application的功能,同时Cache又有丰富而强大的自我管理机制。

    在结束本节以前,让我们来根据第一节中提出的几个问题总结一下Application的特性。

    ·      存储的物理位置。服务器内存。

    ·      存储的类型限制。任意类型。

    ·      状态使用的范围。整个应用程序。

    ·      存储的大小限制。任意大小。

    ·      生命周期。应用程序开始的时候创建(准确来说是用户第一次请求某URL的时候创建),应用程序结束的时候销毁。

    ·      安全与性能。数据总是存储在服务端,安全性比较高,但不易存储过多数据。

    ·      优缺点与注意事项。检索数据速度快,但缺乏自我管理机制,数据不会自动释放。

  • 相关阅读:
    【Rust】二叉搜索树删除
    【Rust】二叉搜索树插入迭代
    【Rust】二叉树后续迭代
    【Rust】二叉树中序迭代
    【Rust】二叉搜索树检索迭代
    【Rust】二叉搜索树检索
    【Rust】二叉搜索树获取极值
    QTP11&11.5破解方法
    1
    操作系统:文件系统 文件系统的格式化操作
  • 原文地址:https://www.cnblogs.com/cuishao1985/p/1573345.html
Copyright © 2020-2023  润新知