【问题标题】:Global.asax, global variables, and editing with codeGlobal.asax、全局变量和用代码编辑
【发布时间】:2013-03-11 17:55:59
【问题描述】:

我有两个问题:

1) 我在 global.asax 文件中声明了我的网站的一些全局变量。它们是简单的小型键/值对,并且只有少数几个。对于我网站上几乎每个页面都需要访问的小值,这是一个很好的做法吗?将它们存储在数据库中并需要进行数据库查找似乎会浪费资源用于不快速变化的值。

2) 如果其中一个值每周更改一次,是否可以允许用户通过表单或其他方式编辑全局变量?

例子:

<script runat="server">

  Overloads Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)

      Application("default_scoring_id") = 3
      Application("week_current") = 3

  End Sub

</script>

在上面的示例中,系统需要知道当前日期在哪一周(其中 15 周)。因此,每周一早上一次,“week_current”值需要更改。

我可以很容易地做到这一点,但是有没有办法让用户在不接触代码的情况下更改这个值?

【问题讨论】:

    标签: asp.net asp.net-3.5 global-variables global-asax


    【解决方案1】:

    典型的做法是把这些放到web.config中,可以编辑。这些&lt;appSettings&gt; 值将在每个页面上可用,但可以编辑文件。

    【讨论】:

      【解决方案2】:

      1) 好的做法通常是将这些值存储在 web.config 中。有关指南,请参阅 herehere

      2) a) 如果您将其存储在 web.config 中,它将很容易更新,无需重新编译,并且 Web 应用程序应立即获取更改。

      b) 更新“周数”之类的内容真的需要手动进行吗?这听起来有点容易出错,如果可能的话,我建议通过根据当前日期计算来自动执行此操作。

      【讨论】:

      • 您似乎可以将星期数作为日期的基础,但是当某些工作被延迟时,这是有问题的,从而阻止了例行的每周更改。不幸的是,我需要让用户决定更改星期的确切时间。
      【解决方案3】:

      我会考虑使用内置缓存(System.Web.Caching.Cache)

      这样您就可以将它们存储在您想要的任何位置(例如在数据库中),在应用程序中轻松更改它们,并且可以快速而廉价地检索。

      从继承自 BasePage 的类中使用给定的 Cache 对象(例如 Cache.Add(..)),从其他地方使用 HttpContext.Current.Cache(例如 HttpContext.Current.Cache.Remove(Key))

      【讨论】:

        【解决方案4】:

        其他答案提出了可以完成并且必须完成的不同方式。但是,即使您想允许用户编辑全局变量,您也必须在共享对象上获取锁或互斥锁,更改全局变量的值,然后释放锁或互斥锁。

        lock(globalsharedobject) //This is C# code.
        {
            Application("default_scoring_id") = 3;
        }
        

        【讨论】:

          【解决方案5】:

          Web.config 是 .NET 方式,或者 ASP.NET 方式,它并不总是最有效或最合适的。

          您的 Global.asax 文件不仅仅是一些事件,您可以将静态数据放在 System.Web.HttpApplication 子类的任何类中,并在您的 Global.asax 文件中继承它。

          HttpSessionState 和 HttpApplicationState 是经典 ASP 时代的遗物,您最好避免使用它们,因为它们没有真正的用途。

          根据对象的类型 (System.Type),您可以设计自己的强类型对象来存储有关应用程序和会话的信息,对于应用程序级别的数据,一堆静态字段就足够了。

          它们必须是静态的,因为每个 HttpModule 以及 HttpApplication 实例都是池化对象,因此为避免这种混淆,请确保您的持久数据存储在一个静态或多个静态字典中。但是在修改这些集合时要注意并发问题。一个好的策略是锁定对象,仅在您修改它的持续时间内,并确保在 modyfiny 集合时不调用任何其他代码,一个简单的交换习惯用法,在这里可能会有所帮助,它很快而且不是- 死锁保证。

          【讨论】:

            【解决方案6】:
            <%@ Application Language="C#" %>
            
            <script runat="server">
            
                void Application_Start(object sender, EventArgs e) 
                {
                // Code that runs on application startup
            
                }
            
                void Application_End(object sender, EventArgs e) 
                {
                //  Code that runs on application shutdown
            
                }
            
                void Application_Error(object sender, EventArgs e) 
                { 
                // Code that runs when an unhandled error occurs
            
                }
            
                void Session_Start(object sender, EventArgs e) 
                {
            
                // Code that runs when a new session is started
            
                }
            
                void Session_End(object sender, EventArgs e) 
                {
                // Code that runs when a session ends. 
                // Note: The Session_End event is raised only when the sessionstate mode
                // is set to InProc in the Web.config file. If session mode is set to StateServer 
                // or SQLServer, the event is not raised.
            
                }
                protected void Application_BeginRequest(Object sender, EventArgs e)
                {
                Context.Items.Add("Request_Start_Time", DateTime.Now);
                }
                protected void Application_EndRequest(Object sender, EventArgs e)
                {
                TimeSpan tsDuration = DateTime.Now.Subtract((DateTime)Context.Items["Request_Start_Time"]);
                Context.Response.Write("<b>Request Processing Time: From Global.asax file " + tsDuration.ToString());
                Application["time"] = tsDuration.ToString();
                }
            
            </script>
            

            【讨论】:

              猜你喜欢
              • 2019-02-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-02-04
              • 2015-06-22
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多