为什么c# Web应用程序重建会导致Application_End()调用

本文关键字:Application End 调用 Web 应用程序 重建 为什么 | 更新日期: 2023-09-27 17:50:22

我注意到,在调试我的应用程序时,有时[InProc]会话状态在重建后被破坏(c# Web应用程序)。事件顺序如下:

  1. 重建,运行应用程序(调试或发布模式,无关紧要)
  2. 在Page_Load()事件中填充会话变量
  3. Session_End()触发Application_End ()
  4. 我执行回发并检查步骤2中填充的会话变量,它是空的。

我正在使用IIS Express运行此应用程序,但无论使用哪个web服务器,它似乎都会发生。这将导致许多问题,因为应用程序不指望会话变量消失。

namespace BlankWebApp
{
  public partial class _Default : System.Web.UI.Page
  {
    protected void Page_Load(object sender, EventArgs e)
    {
      if (!IsPostBack)
      {
        Session["test"] = true;
      }
    }
    protected void butCheckSession_Click(object sender, EventArgs e)
    {
      if (Session["test"] == null)
      {
        // Session_End and Application_End must have been called
      }
    }
  }
}

为什么c# Web应用程序重建会导致Application_End()调用

更改bin文件夹的内容将导致应用程序池回收。这就是Re-Build中发生的事情,因为重新编译将编译应用程序并为项目创建一个新的dll/可执行文件,从而导致bin文件夹中的更改。应用程序池回收将导致会话从服务器内存中删除。

对于更改Web.Config文件也是如此。

你无法避免。您应该有一个独立的开发和生产环境。