Asp.net 会话\u开始中设置的会话值在页面\u PreInit中不可用
我在ASP.NET 4.0 Web窗体应用程序中遇到间歇性问题 在会话_Start中,我将母版页文件路径存储在会话中:Asp.net 会话\u开始中设置的会话值在页面\u PreInit中不可用,asp.net,Asp.net,我在ASP.NET 4.0 Web窗体应用程序中遇到间歇性问题 在会话_Start中,我将母版页文件路径存储在会话中: protected void Session_Start(Object sender, EventArgs e) { // Not shown: get master page path from database Session["MasterPagePath"] = PathIGotFromTheDatabase; } 然后在我的页面的Page_PreIni
protected void Session_Start(Object sender, EventArgs e)
{
// Not shown: get master page path from database
Session["MasterPagePath"] = PathIGotFromTheDatabase;
}
然后在我的页面的Page_PreInit中,我使用该会话值设置Page.MasterPageFile
protected void Page_PreInit(object sender, EventArgs e)
{
Page.MasterPageFile = Session["MasterPagePath"] + @"/MyMasterPage.Master";
}
这在99%的时间内都能正常工作,但偶尔会出现故障,会话[“MasterPagePath”]为空。用户报告他们必须关闭所有活动浏览器会话才能再次使用该站点
我的理解是,由于我在Session_Start中填充了Session[“MasterPagePath”],因此它应该在我的页面的PreInit方法中始终可用。如果我的会话已过期,则在调用Page_PreInit之前,它将始终由会话_Start重新填充
我是不是遗漏了什么?我所描述的情况在什么情况下会发生?我使用InProc会话状态是为了它的价值。我认为在应用程序启动时添加的会话对象在控制级别不可用。应用程序[“myObj”]将可供所有用户使用
有关生命周期的更多信息。我认为在应用程序启动时添加的会话对象在控制级别不可用。应用程序[“myObj”]将可供所有用户使用
关于生命周期的更多信息。我还假设ASP.NET在
页面请求
-阶段(在初始化前
之前)决定是否必须创建新会话。因此,我不认为这是一个“页面生命周期”问题。您使用的是什么框架?你读过这些评论吗:?@Tim有一条有趣的评论说,当两个请求具有相同的会话ID时,Session\u Start会被调用两次。我想这可能是并发或竞争条件问题,但我的理解是,ASP.NET应该在需要时锁定会话。我还假设ASP.NET在页面请求
-阶段(在初始化前
之前)决定是否必须创建新会话。因此,我不认为这是一个“页面生命周期”问题。您使用的是什么框架?你读过这些评论吗:?@Tim有一条有趣的评论说,当两个请求具有相同的会话ID时,Session\u Start会被调用两次。我想这可能是并发或竞争条件问题,但我的理解是,ASP.NET应该在需要时锁定会话。