1

我有两个问题:

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”值需要更改。

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

4

6 回答 6

2

典型的做法是将这些放到 web.config 中,可以进行编辑。然后这些<appSettings>值将在每个页面上可用,但可以编辑文件。

于 2009-05-26T03:29:33.673 回答
1

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

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

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

于 2009-05-26T03:35:53.477 回答
1

1) 好的做法通常是将这些值存储在 web.config 中。请参阅此处此处获取一些指南。

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

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

于 2009-05-26T03:37:00.917 回答
0

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

lock(globalsharedobject) //This is C# code.
{
    Application("default_scoring_id") = 3;
}
于 2009-05-26T04:09:47.870 回答
0

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

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

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

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

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

于 2009-05-26T05:16:02.833 回答
0
<%@ 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>
于 2013-03-11T09:36:04.353 回答