【发布时间】:2012-01-03 22:46:05
【问题描述】:
我想在我的网站上记录用户会话。我希望只设置一个会话变量。但是它的初始化给我带来了问题。
protected void Page_Load(object sender, EventArgs e)
{
if (Session["SESSION_GUID"] == null)
{
Session["SESSION_GUID"] = Guid.NewGuid().ToString();
Response.Redirect(Request.Url.ToString(), true);
return;
}
lnkUpload.Visible = (Session["LOGGED_IN"] != null);
btnLogout.Visible = (lnkUpload.Visible);
}
似乎母版页正在创建变量 OK,但其余页面加载(使用该母版页的页面)。所以在我的日志中,我看到了两个命中。一个没有设置会话 ID,第二个命中有一个会话 ID。
知道为什么这个母版页的子页面加载了两次吗?这仅发生在对站点的第一次请求时。之后,会话运行良好,我们只获得了一次成功。
【问题讨论】:
-
也许我不明白你的问题,但你不是告诉它通过重定向加载两次吗?第一次调用页面时(即 pre-Session ID),会设置会话 ID 并再次加载页面。
-
我显示的代码在母版页中 - 我的逻辑是当页面加载时,它首先加载母版页(?),然后是被请求的实际页面。在母版页的 Page_Load 上,我检查了会话变量。如果它没有设置,我设置它,停止加载被调用页面,并刷新到被调用页面。因此,如果页面 A 使用母版页...我试图通过母版页停止加载页面 A,设置变量,然后加载页面 A。但是页面 A 被加载了两次。我知道我有刷新,但我认为刷新会在页面 A 加载之前执行。
-
我不肯定,但我不认为这是 IIS(或任何其他 Web 服务器,就此而言)的工作方式。当页面被请求时,它被加载。您可以通过调用 Response.ClearContent 和/或 Response.ClearHeaders,然后通过调用 Response.End 尽可能地清理内容,但是您仍然会有一个日志条目指示该页面被请求了两次(因为它是)。
-
@MichaelTodd - 实际上 IIS 确实通过 ASP.NET 页面生命周期以完全不同的方式处理它。一个页面的请求中有多个事件顺序发生,并且可以在整个处理管道中停止处理
-
@jaywon 但这会阻止 IIS 写入指示该页面已被请求的日志吗?我认为这就是 OP 提出问题的依据。
标签: c# asp.net session master-pages