1

我在共享主机系统上有一个 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时为null。

但是,它总是在 application_start 中初始化。除非是系统问题,否则它怎么可能为空?

    protected void Application_Start()
    {
        StaticCache.LoadStaticCache();
    }

回收应用程序池可以 100% 地解决问题。

4

1 回答 1

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();
}
于 2012-04-10T16:12:21.020 回答