我在一个共享主机系统上有一个ASP.Net 4.0网站。应用程序在20分钟不活动后被回收。
在我的应用程序中,一些静态变量是在application_start中初始化的。
当下一个请求到来时,应该重新启动应用程序,执行application_start并重置静态变量。
在非活动期间过后,当我访问依赖于静态变量的页面时,它们是空的,这会产生错误。
因为这些变量是在application_start中初始化的,所以奇怪的是,在一段不活动的时间后,它们将为null,因为应用程序重新启动会重新初始化它们。
实际上,当我看到空引用错误时,回收应用程序池(并执行application_start)可以解决问题,直到下次从内存中删除应用程序为止。
我想知道当从内存中删除应用程序时,是否发生了其他类型的系统内存问题,因为如果应用程序只是被回收,那么application_start中静态变量的重新初始化将意味着没有理由将静态变量设置为空。
因为静态变量不是垃圾回收的,所以它们在初始化后永远不应该为空。
这些错误永远不会出现在任何开发人员的机器上,只会出现在共享主机系统上。在application_start中初始化的静态变量变成null的其他原因可能是什么?
没有重置变量的代码。它们是私有字段,只包含通过get方法进行的访问。
代码:
private static List<State> stateList;
public static void LoadStaticCache()
{
var service = DependencyResolver.Current.GetService<ILocationService>();
stateList = service.GetAllStates().ToList();
}
public static List<State> GetStates()
{
return stateList;
}当满足非活动时间段时,下一次访问stateList时,它为空。
但是,它始终在application_start中初始化。除非是系统问题,否则它怎么可能是空的呢?
protected void Application_Start()
{
StaticCache.LoadStaticCache();
}回收应用程序池可以100%修复问题。
发布于 2012-04-11 00:12:21
听起来您的问题与会话超时有关。
与早期版本的IIS不同,如果您的托管服务器运行的是集成模式的IIS7.0或更高版本,Application_Start将无法访问当前的HTTP上下文,因为它还不存在。经典模式下的IIS 7.0不会有任何问题。
在任何一种情况下,解决方案都是将您的初始化移到Global.asax中的Session_Start:
//protected void Application_Start()
//{
// StaticCache.LoadStaticCache();
//}
protected void Session_Start(object sender, EventArgs e)
{
StaticCache.LoadStaticCache();
}https://stackoverflow.com/questions/10066063
复制相似问题