.Net 4.0和IIS7下的应用程序状态无效

时间:2011-11-27 18:17:59

标签: iis-7 state

我一直在开发ASP.Net 4.0 Web应用程序,我使用了HttpApplicationState类及其Contents属性来设置Global_asax文件的Application_Start事件中的一些变量。

当应用程序在我的开发计算机上按预期运行时,当它在运行IIS7的生产服务器上部署时,为应用程序状态变量返回的值为null。我尝试了各种代码技术,比如使用HttpContext,Runtime.Cache,Application [“key”]和Application.Contents.Add [“key”,Value],都没有成功。我现在想知道IIS7上是否应该有一个特殊配置;研究这个主题我看到人们说应用程序执行的应用程序池只能由一个工作进程提供服务;我不是IIS7专家,但是选择应用程序池,并查看其高级属性,我可以看到池配置为最多有1个工作进程,所以我相信这应该涵盖它。我花了两天时间在这上面,所以如果有人对这个问题有任何了解,请帮忙!

感谢

克里斯

2 个答案:

答案 0 :(得分:1)

  1. HttpContext.Current.Application在IIS 6和7,集成模式或经典版本中均可用。

  2. 在所有环境中也会调用global.asax中的Application_Start事件。

  3. 在集成模式下运行IIS 7+时,global.asax中的事件处理程序仅应用于映射到ASP.NET处理程序的请求(从Page类派生的对象)。自定义HttpModules适用于所有请求。

  4. 应用程序状态或任何其他静态变量不会从一个IIS实例共享到另一个实例 - 因此,其他一个AppPool或工作进程中的设置不可见。

  5. AppPool重置时应用程序状态和后init静态变量设置会丢失(尽管您还将获得新的Application_Start事件)。无论重置是由于工人闲置还是通常的每日重置,都是如此。

  6. 最好不要使用HttpApplicationState,而是创建自己的静态类,使用应用程序范围设置的静态属性。这样,您的访问是强类型的,具有Intellisense,并且不容易拼写错误的键字符串。

  7. 无论是使用自己的静态类还是HttpApplicationState,请务必在读取设置之前设置锁定,也可以更改它。如果您决定采用这种方法,可以使用HttpApplicationState.Lock()。

  8. 您可以尝试在IIS Express本地,甚至IIS 7(Vista)或7.5(W7)下运行您的应用,以帮助调试您的问题。卡西尼在这个阶段被弃用了;我会尽量避免使用它。

答案 1 :(得分:0)

可能是您没有正确的应用程序池模式。

IIS 7应用程序池有2种模式,经典和集成。看到。 http://weblogs.asp.net/jgaylord/archive/2008/09/04/iis7-integrated-mode-and-global-asax.aspx