我希望能够针对每个浏览器标签页维护一个会话状态。
在ASP.NET中是否很容易(或者说可能)实现呢?
例如:用户在Firefox中按下Ctrl-T五次,然后在每个选项卡中访问网站。我希望每个标签页在服务器端有自己独立的会话状态。
If Not IsPostback Then
'Generate a new PageiD'
ViewState("_PageID") = (New Random()).Next().ToString()
End If
当你将某物保存到 Session State 中时,请包含 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,并且看起来像是另一个访问者。
使用Brian Webster的答案,我发现XMLHttpRequest存在问题。事实证明,XMLHttpRequest没有将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"];
//...
}