asp.net - 会话 - 多个浏览器标签 - 不同的会话?

时间:2010-05-15 15:19:44

标签: asp.net iis session

我想维护每个浏览器标签的会话状态。

在ASP.NET中这很简单(甚至可能)吗?

示例:用户在firefox中按Ctrl-T 5次,并在每个标签中访问该网站。我希望每个标签在服务器上都有自己的会话状态

3 个答案:

答案 0 :(得分:21)

为方便一个用户的多标签会话状态而不弄乱网址,请执行以下操作。

在表单加载功能中,包括:

If Not IsPostback Then
  'Generate a new PageiD'
  ViewState("_PageID") = (New Random()).Next().ToString()
End If

当您将某些内容保存到会话状态时,请包含PageID:

Session(ViewState("_PageID").ToString() & "CheckBoxes") = D

备注

  • 与会话ID一般,您不能相信恶意查看者不会更改SessionID / PageID。这只是一个可以信任所有用户的环境的有效解决方案。幸运的是,ViewState确实提供了比使用隐藏输入字段更多的保护。
  • 在PostBack上恢复ViewState之前,您将无法访问PageID。因此,您将无法访问page_init()处理程序中的PageID。

答案 1 :(得分:15)

<configuration>
  <system.web>
    <sessionState cookieless="true"
      regenerateExpiredSessionId="true" />
  </system.web>
</configuration>

http://msdn.microsoft.com/en-us/library/ms178581.aspx

在这种情况下,每个标签都会获得唯一的ID,看起来它就像是另一个访问者。

答案 2 :(得分:1)

使用Brian Webster的答案我发现XMLHttpRequests存在问题。事实证明,XMLHttpRequests没有将IsPostback标志设置为true,因此请求看起来像一个新请求,并且最终会为该请求建立一个新的会话状态。为了解决这个问题,我还检查了ViewState("_PageID")

的值

所以我的代码在C#中看起来像这样:

protected dynamic sessionVar; //a copy of the session variable

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack && ViewState["_PageID"] == null)
    {
        ViewState["_PageID"] = (new Random()).Next().ToString();
        Session[ViewState["_PageID"] + "sessionVar"] = initSessionVar(); //this function should initialize the session variable
    }
    sessionVar = Session[ViewState["_PageID"] + "sessionVar"];
    //...
}