共享主机环境中的哪些系统配置或故障可以使只读静态变量为空?

时间:2012-04-08 20:04:20

标签: shared-hosting static-members

我在共享主机系统上有一个ASP.Net 4.0网站。应用程序在不活动20分钟后回收。

在我的应用程序中,一些静态变量在application_start中初始化。

当下一个请求进入时,应该重新启动应用程序,执行application_start并重置静态变量。

在不活动期间,当我访问依赖于静态变量的页面时,它们为空并且会产生错误。

由于这些变量是在application_start中初始化的,因此在不活动期间它们将为null之后似乎很奇怪,因为应用程序重新启动会重新初始化它们。

事实上,当我看到空引用错误时,回收应用程序池(并执行application_start)可以解决问题,直到下次从内存中删除应用程序。

我想知道当从内存中删除应用程序时是否会出现其他类型的系统内存问题,因为如果应用程序只是被回收,那么在application_start中重新初始化静态变量意味着没有理由静态为空。

由于静态变量不是垃圾收集的,因此在初始化后它们永远不应为空。

错误永远不会发生在任何开发人员计算机上,只会发生在共享主机系统上。在application_start中初始化为静态变量的其他原因可能是什么?

没有代码可以重置变量。它们是私有字段,仅包含通过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%的时间内解决问题。

1 个答案:

答案 0 :(得分:1)

听起来您的问题与会话超时有关。

与早期版本的IIS不同,如果您的托管服务器使用集成模式运行IIS 7.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();
}