【问题标题】:global.asax scope and lifetime clarificationglobal.asax 范围和生命周期说明
【发布时间】:2011-07-29 17:57:53
【问题描述】:

我需要在我目前正在处理的项目中实现几个应用程序级别的行为。 有几件事我需要弄清楚: 1. 在哪里以及如何定义应用程序级变量? 2. 这些变量的生命周期是多少?或者更准确地说,在什么情况下它们会被丢弃? (应用程序池回收?应用程序二进制文件从内存中删除并在下一个请求时重新编译?等等。) 3. global.asax 文件是放置会话计数器的好地方,还是将值存储到数据库/文件是保存此类数据的更好方法?

欢迎任何 cmets 或想法。 谢谢! -埃拉德

【问题讨论】:

    标签: asp.net global-asax application-state


    【解决方案1】:

    应用程序级变量具有应用程序生命周期。这意味着应用程序池被回收,它们被丢弃。
    应用程序池可以出于不同的原因被回收。可以对 IIS 6/7 进行配置,以便在一定时间后、在一定数量的请求后或在指定的时间间隔后回收应用程序池。 您可以这样设置应用程序变量:

    Application["DbConfig"] = "my value";
    

    但您必须注意如果您尝试在不同的地方设置/访问可能会遇到的问题。您必须采用一种方法在变量更新时锁定它们。

    我使用web.config 获取所有配置参数,然后我创建了自己的类来存储应用程序字段:

    namespace Web.My
    {
        public class Application
        {
            public static string ApplicationStorageFolder
            {
                get
                {
                    return (System.IO.Path.Combine(HttpContext.Current.Server.MapPath("~"), "_AppStorage"));
                }
            }
        }
    }
    

    如果我需要设置一些字段,我会在应用程序启动时进行 Application_Start 如果您需要持久化信息,您可以创建自己的配置文件(xml 或简单文本)以在应用程序启动和关闭时存储和读取值。您可以在 XML 文件中序列化您的类,以便准备好它,轻松地重新填充您的属性。 一个数据库也可以。 我会对会话计数器做同样的事情。

    【讨论】:

    • 感谢您的详细回复!所以你说你不会使用应用级变量来存储会话计数器?
    • 没有。我不会将它用于应用程序计数器,因为您不能依赖它,因为它可能会被回收。一个会话应该没问题。
    • 非常感谢。这正是我正在寻找的信息。
    • 没问题。如果您对msdn.microsoft.com/en-us/magazine/cc301579.aspx 感兴趣,可以在这里找到更多信息,并记住 asp.net 也有一个缓存对象,这在某些情况下非常有用asp.net/general/videos/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多