首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在共享主机环境中,什么系统配置或故障可以使只读静态变量为空?

在共享主机环境中,什么系统配置或故障可以使只读静态变量为空?
EN

Stack Overflow用户
提问于 2012-04-09 04:04:20
回答 1查看 118关注 0票数 1

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

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

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

在非活动期间过后,当我访问依赖于静态变量的页面时,它们是空的,这会产生错误。

因为这些变量是在application_start中初始化的,所以奇怪的是,在一段不活动的时间后,它们将为null,因为应用程序重新启动会重新初始化它们。

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

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

因为静态变量不是垃圾回收的,所以它们在初始化后永远不应该为空。

这些错误永远不会出现在任何开发人员的机器上,只会出现在共享主机系统上。在application_start中初始化的静态变量变成null的其他原因可能是什么?

没有重置变量的代码。它们是私有字段,只包含通过get方法进行的访问。

代码:

代码语言:javascript
复制
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中初始化。除非是系统问题,否则它怎么可能是空的呢?

代码语言:javascript
复制
    protected void Application_Start()
    {
        StaticCache.LoadStaticCache();
    }

回收应用程序池可以100%修复问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-11 00:12:21

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

与早期版本的IIS不同,如果您的托管服务器运行的是集成模式的IIS7.0或更高版本,Application_Start将无法访问当前的HTTP上下文,因为它还不存在。经典模式下的IIS 7.0不会有任何问题。

在任何一种情况下,解决方案都是将您的初始化移到Global.asax中的Session_Start:

代码语言:javascript
复制
//protected void Application_Start()
//{
//    StaticCache.LoadStaticCache();
//}

protected void Session_Start(object sender, EventArgs e) 
{
    StaticCache.LoadStaticCache();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10066063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档