Application_End过早/经常被调用

时间:2012-01-24 09:25:54

标签: asp.net-mvc-3 application-pool recycle

我在Application_End上的项目中使用临时数据库:

protected void Application_End() {
    if (_db != null) _db.Dispose();
}

问题是Application_End似乎经常在我浏览我的web项目时被调用 - 似乎当我在db中编辑一个对象时,更改成功,数据库被处理,到时候我重定向到索引 - 已创建一个新的数据库并显示未更改的对象,就好像什么都没发生一样。

当会话结束或经过一定的空闲时间后,不应该只调用Application_End吗?

有人能告诉我如何才能确保只在我实际使用该应用程序时才调用Application_End吗?

1 个答案:

答案 0 :(得分:11)

  

问题是Application_End似乎经常被调用   我正在浏览我的网络项目

卸载AppDomain时会发生这种情况。在您进行调试时,每次重新编译项目时都会发生这种情况,这是正常的,因为每次重新编译bin文件夹中的程序集时都会重新生成,ASP.NET只会回收应用程序域。

在IIS中部署应用程序时,只有当IIS决定回收应用程序时,才会发生这种情况。它可能发生在不同的情况下:一段时间不活动,达到CPU /内存阈值,......

  

不应该在会话结束时调用Application_End   或者经过一定的闲置时间后?

不,Application_End与用户会话无关。它在应用程序域的生命周期结束时调用。

  

有人能告诉我如何确保Application_End   只有在我实际使用完应用程序时才会调用它?

情况就是这样:当应用程序域准备好卸载时,ASP.NET运行时调用Application_End

因此,如果您想避免这种情况发生,您应该使用持久数据库而不是内存存储。如果您使用内存存储,那么您将与应用程序的生命周期联系起来,因为您已经注意到它可能非常短。