【问题标题】:How to Handle Concurrent sessions in .Net C#如何在 .Net C# 中处理并发会话
【发布时间】:2013-08-01 06:10:18
【问题描述】:

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

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

【问题讨论】:

  • 不是一个好主意。如果您尝试同时处理两个会话,您将面临更大的问题。
  • 您正在使用(或测试)哪个浏览器?
  • 提示:您可以消除 GetSessionValue 中的 if 语句,因为您正在检查 == null 但如果是则返回相同的值。只需返回HttpContext.Current.Session[sessionName]
  • 我不明白这个问题。 “sessionName”值从何而来——它是 URL 的一部分吗?第二个标签如何获得它的地址 - 您是手动输入还是在新标签中打开链接?
  • @Maarten - 我正在使用 Firefox。实际上,该应用程序是特定于 Firefox 的。但即使我返回 HttpContext.Current.Session[sessionName] (没有 if)那么问题也没有解决

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


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

      • :正如您所说,由于会话状态在相同的浏览器之间共享,我认为我的问题甚至没有解决方案。无论如何感谢所有的指导。感激不尽!
      • 如果我理解您的问题,为什么匿名用户的部分 id 不同? This question might answer your question为每个页面请求生成一个新的会话 ID,直到访问会话对象。
      猜你喜欢
      • 2011-07-19
      • 2012-11-10
      • 2019-03-26
      • 2019-08-20
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多