【问题标题】:Session variable and Masterpages会话变量和母版页
【发布时间】: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


【解决方案1】:

内容页的Page_Load 事件将在母版页的Page_Load 之前调用,如ASP.NET Page Lifecycle 中的步骤6-7 所示

母版页Page_Init事件在内容页Page_Init事件之前被调用,所以如果你所做的只是检查会话,最好在母版页的Page_Init中处理它并重定向那里。根据项目中其他代码的外观,这可能会导致问题,但从概念上讲,您要做的第一件事是检查 Session 并正确处理,因此在处理重定向之前不需要加载页面/控件。

【讨论】:

【解决方案2】:

尝试在母版页中执行 Response.End()。这将停止渲染剩余的标记。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多