为什么C#Web应用程序在Application_End()调用中重新生成结果?

时间:2015-05-21 18:43:29

标签: c# asp.net visual-studio

我注意到在调试我的应用程序时,有时会在重构(C#Web应用程序)后销毁[InProc]会话状态。事件顺序如下:

  1. 重建&运行应用程序(调试或发布模式,不重要)
  2. 在Page_Load()事件
  3. 中填充会话变量
  4. Session_End()然后触发Application_End fires()
  5. 我执行回发并检查在步骤2中填充的Session变量,它是空的。
  6. 我正在使用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
          }
        }
      }
    }
    

1 个答案:

答案 0 :(得分:2)

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

同样适用于更改Web.Config文件也是如此。

你无法避免这种情况。您应该有一个单独的开发和生产环境。