Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么C#Web应用程序重建会导致应用程序_End()调用?_C#_Asp.net_Visual Studio - Fatal编程技术网

为什么C#Web应用程序重建会导致应用程序_End()调用?

为什么C#Web应用程序重建会导致应用程序_End()调用?,c#,asp.net,visual-studio,C#,Asp.net,Visual Studio,我注意到在调试我的应用程序时,[InProc]会话状态有时会在重新构建(C#Web应用程序)后被破坏。事件顺序如下: 重新生成并运行应用程序(调试或发布模式,无所谓) 在Page_Load()事件中填充会话变量 会话_End()激发,然后应用程序_End激发() 我执行回发并检查步骤2中填充的会话变量,该变量为空 我使用IIS Express运行此应用程序,但它似乎与正在使用的web服务器无关。这会导致许多问题,因为应用程序不指望会话变量消失 namespace BlankWebApp {

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

  • 重新生成并运行应用程序(调试或发布模式,无所谓)
  • 在Page_Load()事件中填充会话变量
  • 会话_End()激发,然后应用程序_End激发()
  • 我执行回发并检查步骤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
          }
        }
      }
    }
    

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

    同样,更改
    Web.Config
    文件也是如此


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

    因此,每当我在开发过程中重新构建时(或应用程序池在生产中回收时),我都必须接受应用程序将丢失页面加载事件中填充的所有会话变量?如果是这样,我应该在哪里填充会话变量以确保它们不会在此场景中被销毁?@bperniciaro在数据库中!或其他缓存,但从不在会话中。确实应该避免会话-这是您所经历的第一个原因。@bperniciaro,
    Out Proc
    ,请参阅,并查看是否可以避免使用会话,请记住,它们是在web服务器上为每个用户维护的,并且可能会在长期内存方面花费高昂。@Ahmedilyas在我们的场景中,我们实际上是在使用会话变量来确定每个用户的会话何时过期。因此,在回发时,我们检查初始填充的会话变量是否为NULL,如果为NULL,则将用户重定向到“会话过期”页面。但是,当应用程序池明显回收时,用户会过早地被重定向到那里。使用此解决方案你无能为力。唯一需要做的是将其从进程中取出,即SQL存储或使用一些缓存机制,如AppFabric