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

本文关键字:处理 并发 会话 Net | 更新日期: 2023-09-27 18:25:37

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

该特定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;
}

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

但是,当我打开该应用程序的两个选项卡或两个窗口时该申请;成员的会话id不匹配。电流选项卡拾取打开的辅助选项卡的ID。

如果你在浏览器的两个不同选项卡中打开同一个网站,它们会共享会话。它是经过设计的。

你可以复制它。登录bankofamerican.com,打开一个新的选项卡并粘贴https://secure.bankofamerica.com/transfers/funds-transfer.go请注意,您不需要登录

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

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

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

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

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

换句话说,在页面中的隐藏字段中写入一些键值,这些字段将作为回发请求的一部分发送回,以区分每个浏览器选项卡与其他选项卡。通过明智地使用页面的ASP视图状态,可以处理很多问题。我相信您也可以强制对视图状态值进行加密。

或者,您可以使用随机密钥对隐藏字段进行编码,该密钥可用于检索保存在会话缓存中的数据。不过,这种方法很难正确执行,因为如果用户关闭选项卡或浏览器,您必须处理从会话中删除旧(过期)密钥的问题。

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