为什么C#Web应用程序重建会导致应用程序_End()调用?
我注意到在调试我的应用程序时,[InProc]会话状态有时会在重新构建(C#Web应用程序)后被破坏。事件顺序如下:为什么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 {
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