【发布时间】:2011-02-19 21:39:04
【问题描述】:
我想为每个浏览器标签维护一个会话状态。
在 ASP.NET 中这很容易(甚至可能)吗?
示例:用户在 Firefox 中按 Ctrl-T 5 次,然后在每个选项卡中访问该站点。我希望每个选项卡在服务器上都有自己的会话状态
【问题讨论】:
我想为每个浏览器标签维护一个会话状态。
在 ASP.NET 中这很容易(甚至可能)吗?
示例:用户在 Firefox 中按 Ctrl-T 5 次,然后在每个选项卡中访问该站点。我希望每个选项卡在服务器上都有自己的会话状态
【问题讨论】:
使用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"];
//...
}
【讨论】:
为了方便一个用户的多标签会话状态而不使 URL 混乱,请执行以下操作。
在您的表单加载功能中,包括:
If Not IsPostback Then
'Generate a new PageiD'
ViewState("_PageID") = (New Random()).Next().ToString()
End If
当您将某些内容保存到会话状态时,请包含 PageID:
Session(ViewState("_PageID").ToString() & "CheckBoxes") = D
注意事项:
【讨论】:
<configuration>
<system.web>
<sessionState cookieless="true"
regenerateExpiredSessionId="true" />
</system.web>
</configuration>
http://msdn.microsoft.com/en-us/library/ms178581.aspx
在这种情况下,每个标签都会获得唯一的 ID,并且看起来就像是另一个访问者。
【讨论】: