我有两个问题:
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”值需要改变。
我可以轻松地执行此操作,但有没有办法让用户可以在不触及代码的情况下更改此值?
答案 0 :(得分:2)
典型的做法是将这些内容放入web.config中,可以对其进行编辑。然后,每个页面上都会显示这些<appSettings>
值,但可以编辑该文件。
答案 1 :(得分:1)
我会考虑使用内置的Cache(System.Web.Caching.Cache)
通过这种方式,您可以将它们存储在任何您想要的地方(例如在数据库中),轻松地在应用程序中更改它们,并且可以快速便宜地检索。
从继承自BasePage的类中使用给定的Cache对象(例如Cache.Add(..))并从其他地方使用HttpContext.Current.Cache(例如,HttpContext.Current.Cache.Remove(Key))< / p>
答案 2 :(得分:1)
1)良好的做法通常是在web.config中存储这些值。有关指南,请参阅here和here。
2)a)如果您将其存储在web.config中,它将很容易更新,而无需重新编译,Web应用程序应立即获取更改。
b)更新“周数”之类的东西真的需要手动过程吗?这听起来有点容易出错,如果可能的话,我会建议根据当前日期自动计算。
答案 3 :(得分:0)
其他答案表明可以采取不同的方式,而且必须这样做。但是,即便如此,如果您想允许用户编辑全局变量,您还必须在共享对象上获取锁或Mutex,更改全局变量的值,然后释放锁或Mutex。
lock(globalsharedobject) //This is C# code.
{
Application("default_scoring_id") = 3;
}
答案 4 :(得分:0)
Web.config是.NET方式,或ASP.NET方式,它并不总是最有效或最合适的。
你的Global.asax文件不仅仅是一些事件,你可以将静态数据放在任何继承System.Web.HttpApplication的类中,并在你的Global.asax文件中继承它。
HttpSessionState和HttpApplicationState是遗留物,从经典的ASP时间开始,你可以很好地避免它们,因为这个服务没有真正的用途。
根据对象的类型(System.Type),您可以设计自己的强类型对象来存储有关应用程序和会话的信息,对于应用程序级数据,一堆静态字段就足够了。
它们必须是静态的,因为每个HttpModule以及HttpApplication实例都是池对象,所以为了避免这种混淆,请确保您的持久数据存储在静态或几个静态的dicionaries中。但是在修改这些集合时要注意并发问题。一个好的策略是锁定对象,只是在你修改它的过程中,并确保你没有调用任何其他代码,而modyfiny集合,一个简单的交换习语,在这里可能会有所帮助,它很快,它是一个非-deadlock guarntee。
答案 5 :(得分: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>