繁体   English   中英

如何在.Net C#中处理并发会话

[英]How to Handle Concurrent sessions in .Net C#

我正在开发一个应用程序,该应用程序在会话中保存一些成员(未登录的用户)信息。

该特定ID用于付款和执行其他操作。 但是,当我打开该应用程序的两个选项卡或该应用程序的两个窗口时; 成员的会话ID不匹配。 当前选项卡获取已打开的辅助选项卡的ID。

我要求一些指导/帮助。

我正在使用以下代码:

public static object GetSessionValue(string sessionName) {
    if (HttpContext.Current.Session[sessionName] == null) {
        return null;
    } else {
        return HttpContext.Current.Session[sessionName];
    }
}

public static void SetSessionValue(string sessionName, object sessionValue) {
    HttpContext.Current.Session[sessionName] = sessionValue;
}

但是,当我打开该应用程序的两个选项卡或该应用程序的两个窗口时; 成员的会话ID不匹配。 当前选项卡获取已打开的辅助选项卡的ID。

如果您在浏览器的两个不同选项卡中打开同一网站,则它们将共享会话。 这是设计使然。

您可以复制它。 登录到bankofamerican.com,然后打开一个新标签并粘贴https://secure.bankofamerica.com/transfers/funds-transfer.go 注意,您无需登录。

但是,如果将URL粘贴到新的浏览器窗口中(在一个浏览器窗口中登录- 必须是相同类型的浏览器 ),则它们共享会话。

Session对象用于共享给定浏览器上一系列页面加载的状态。 这对于存储诸如用户登录名以及用户具有的权限之类的信息非常有用,因为每次加载页面时,它都是浏览器背后的同一个人(AKA用户)。

您描述的问题是,您希望同一浏览器的两个选项卡显示不同的状态,也就是说,如果选项卡1位于主页上,而选项卡2位于帐户页面上,则您不希望选项卡2刷新以加载主页,留在帐户页面上。 这是页面级别的状态,而不是用户级别的状态,因此您不应将信息存储在Session中。

如果使用WebForms(.aspx页)运行站点,则应查看MSDN上的ViewState 如果您使用的是MVC,则应考虑使用javascript和AJAX更新页面并将页面状态存储在客户端的js变量中。

在同一浏览器中打开的所有选项卡在服务器端共享相同的ASP会话。 因此,一般的解决方案是在网页本身(浏览器选项卡)中嵌入足够的信息,以便可以使用其回发来从共享会话中检索适当的对话。

换句话说,在页面的隐藏字段中写入一些键值,这些键值将作为回发请求的一部分发送回去,以区分每个浏览器选项卡。 明智地使用页面的ASP viewstate可以处理很多此类情况。 我相信您也可以强制将viewstate值加密。

另外,您可以使用随机密钥自己对隐藏字段进行编码,该随机密钥可用于检索保存在会话缓存中的数据。 但是,这种方法很难正确执行,因为如果用户关闭了标签页或浏览器,您确实要从会话中删除旧的(过期的)键。

例如,我有一个Web应用程序,它以固定长度的页面显示数据列表。 因为我希望用户能够同时打开多个列表,所以每个列表都在单独的浏览器选项卡中,因此我将当前页面信息(页面编号,列表编号等)嵌入到HTML页面的隐藏字段中。 然后,我在回发时读取这些隐藏字段的值,以恢复执行该回发的特定浏览器选项卡的正确页面上下文。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM