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

时间:2013-07-31 15:52:54

标签: c# asp.net asp.net-mvc session-variables sessionid

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

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

3 个答案:

答案 0 :(得分:0)

  

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

如果您在浏览器的两个不同标签中打开同一网站,他们会共享会话。这是设计的。

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

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

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

或者,您可以使用随机密钥对自己的隐藏字段进行编码,该随机密钥可用于检索您在会话缓存中保存的数据。但是,这种方法更难做到,因为如果用户关闭其标签或浏览器,您已经处理了从会话中删除旧(过期)密钥的问题。

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