• MVCApplication


    Application简述(不如Cache)

    在asp.net环境下,Application对象来自HttpApplictionStat类。它可以在多个请求、连接之间共享公用信息,也可以在各个请求连接之间充当信息传递的管道。使用Application对象来保存我们希望传递的变量。由于在整个应用程序生存周期中,Application对象都是有效的,所以在不同的页面中都可以对它进行存取,就像使用全局变量一样方便。如果用到多个用户之间的通信的时候,多用在网站计算器等,存活于整个应用程序运行周期static作用于应用程序整个运行周期。


    asp.net为我们提供了另外一种全局变量保存方法,Application对象,它也是面向所有用户,它的生命周期也依赖于应用程序,当应用程序初始化后它就开始重建。但它最大的缺点是:application不可以指定过期时间,只能通过人工使用Remove或RemoveAll或RemoveAt方法或者关闭应用程序 移除,达到过期目的,这样不太智能,,此时就要用到cache管理。

    Application使用(与session用法大致相同)

    Application的创建:

    
    Application["application名称"] = "application的值";
    
    

    Application读取

    
    string str = Application["application名称"];
    
    

    常用的属性和方法

    
    All--------------------返回全部的Application对象变量到一个对象数组
    AllKeys--------------返回全部的Application对象变量到一个字符串数组
    Count----------------取得Application中对象变量的数量
    ItemApplication----变量名称传回的内容值
    Add------------------新增一个Application变量值
    Clear----------------清空全部Application变量值
    Get-------------------变量名传回的变量值
    Set--------------------更新Application变量值
    Lock------------------锁定所有Application变量值
    UnLock--------------解除锁定Application变量
    
    

    Application对象特性:

    
    存储的物理位置:服务器内存。
    
    存储的类型限制:任意类型。
    
    状态使用的范围:整个应用程序。
    
    存储的大小限制:任意大小。
    
    生命周期:应用程序开始的时候创建(准确来说是用户第一次请求某URL的时候创建),应用程序结束的时候销毁。
    
    安全与性能:数据总是存储在服务端,安全性比较高,但不易存储过多数据。
    
    优缺点与注意事项:检索数据速度快,但缺乏自我管理机制,数据不会自动释放。
    
    

    应用程序生命周期事件和 Global.asax 文件

    在应用程序的生命周期期间,应用程序会引发可处理的事件并调用可重写的特定方法。若要处理应用程序事件或方法,可以在应用程序根目录中创建一个名为Global.asax 的文件。
    如果创建了Global.asax 文件,ASP.NET 会将其编译为从 HttpApplication 类派生的类,然后使用该派生类表示应用程序。
    HttpApplication 进程的一个实例每次只处理一个请求。由于在访问应用程序类中的非静态成员时不需要将其锁定,这样可以简化应用程序的事件处理过程。这样还可以将特定于请求的数据存储在应用程序类的非静态成员中。例如,可以在Global.asax 文件中定义一个属性,然后为该属性赋一个特定于请求的值。
    通过使用命名约定 Application_event(如 Application_BeginRequest),ASP.NET 可在Global.asax 文件中将应用程序事件自动绑定到处理程序。这与将 ASP.NET 页方法自动绑定到事件(如页的 Page_Load 事件)的方法类似。Application_Start 和 Application_End 方法是不表示 HttpApplication 事件的特殊方法。在应用程序域的生命周期期间,ASP.NET仅调用这些方法一次,而不是对每个HttpApplication 实例都调用一次。
    下表列出在应用程序生命周期期间使用的一些事件和方法。实际远不止列出的这些事件,但这些事件是最常用的。

    利用global.asax文件加Application对象实现简单的网站计数:

    global.asax文件(练习):
    using System.Diagnostics;
    using System.Web.Mvc;
    using System.Web.Optimization;
    using System.Web.Routing;
    
    namespace JJQ2
    {
        public class MvcApplication : System.Web.HttpApplication
        {
            protected void Application_Start()
            {
                // 在应用程序启动时运行的代码
                Application["count"] = 0;//初始设置计数从0开始
                Debug.WriteLine("Application_Start()");
                AreaRegistration.RegisterAllAreas();
                //FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
                RouteConfig.RegisterRoutes(RouteTable.Routes);
                BundleConfig.RegisterBundles(BundleTable.Bundles);
            }
            void Application_Error()
            {
                // 在出现未处理的错误时运行的代码
            }
            protected void Application_end()
            {
                Debug.WriteLine("Application_end()");
                //  在应用程序关闭时运行的代码
            }
    
            void Session_start()
            {
                Debug.WriteLine("Session_start()");
                // 在新会话启动时运行的代码
                Application.Lock();//同步,避免同时写入
                Application["count"] = (int)Application["count"] + 1;//没建立一个会话该全局变量加1
                Application.UnLock();//同步结束
            }
    
            void Session_end()
            {
                Debug.WriteLine("Session_end()");
                // 在会话结束时运行的代码。 
                // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为 InProc 时,才会引发 Session_End 事件。
                // 如果会话模式设置为 StateServer 
                // 或 SQLServer,则不会引发该事件。
            }
        }
    }
    
    

    使用网站计数:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
     
    public partial class login : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
                Response.Write("欢迎光临!");
                Response.Write("您是第");
                Response.Write((int)Application["count"]);
                Response.Write("个访问此网站的人!");
        }
    }
    
    

    Ps::

    1. application是在asp阶段使用的,后来升级到.net后,使用的是cache,但为了向前兼容,依然保留了application。
      2.

      cache比application使用更加灵活,功能更强大。

      cache可以设置每一个item的优先级,当服务器内存不够时,将对cache进行压缩,将一些很长时间没使用的或者优先级低的item从cache中移去。

      3.cache中可设置某个item的依赖性,依赖的对象可以是 cache中的其他item或者是某个文件。当依赖的item或者文件发生改变时,此item的内容会自动更新或者移除。

      4.效率上,cache 要比application高,部分原因是因为appliction并发访问时需要调用lock和unlock,这将所有的application变量全锁定,而cache内部实现了并发访问时的互锁,每次可以只对某一个item加锁,而不是对整个cache加锁。
  • 相关阅读:
    【POJ】[1703]Find them, Catch them
    【杭电】[2717]Catch That Cow
    【杭电】[2717]Catch That Cow
    【杭电】[1716]排列2
    【杭电】[1716]排列2
    【杭电】[2084]数塔
    【杭电】[2084]数塔
    【杭电】[1003]Max Sum
    【杭电】[1003]Max Sum
    [leetcode]117. Populating Next Right Pointers in Each NodeII用next填充同层相邻节点
  • 原文地址:https://www.cnblogs.com/jsll/p/11625009.html
Copyright © 2020-2023  润新知