【问题标题】:Losing item from session intermittently间歇性地从会话中丢失项目
【发布时间】:2014-09-04 17:18:45
【问题描述】:

我有点迷路了……

我们正在使用 sqlserver 会话共享,并且在我们的生产(2 台服务器)和暂存(2 台服务器)上,我只是间歇性地从会话中丢失一项。登台和生产都是负载平衡的,并且在相同的服务器上,但指向不同的数据库。

我的本​​地开发和开发站点(不同的服务器)没有这个问题。这些都使用 dev 数据库。

Sql 服务器会话表和存储过程是特定于环境的,因为它们是在开发、登台或生产数据库中设置的。

在会话中放置项目的代码

SessionService.AddItem(SessionKeys.LoggedInUser, user);  //this is always available

SessionService.AddItem(SessionKeys.Impersonator, inhouseUser); //this is lost intermittently


public static void AddItem(string key, object value)
        {
            CheckSessionAvailability();
            HttpContext.Current.Session[key] = value;
        }

从会话中获取项目:

User inhouseUser = SessionService.GetItem<User>(SessionKeys.Impersonator);


public static T GetItem<T>(string key)
        {
            object item = null;
            CheckSessionAvailability();
            item = HttpContext.Current.Session[key];
            if ((item != null) && !(item is T))
            {
                throw new ApplicationException("Cannot convert");
            }

            return (T)item;
        }

【问题讨论】:

  • 你有在 web.config 中定义的机器密钥吗?
  • 我已回收应用程序池并重新启动暂存站点。这没有帮助。
  • 我已经通过 ip 测试了暂存节点(2 个实例),并且两个会话项都可用。
  • 我已经更改了密钥,而不是放置完整的用户对象,现在我只为第二个项目放置用户 ID。它仍然在做同样的事情。

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


【解决方案1】:

我们的暂存站点是负载平衡的……我们禁用了节点 2,只使节点 1 处于活动状态。它没有任何问题。

最初,我们没有在暂存站点或生产站点上启用持久性。我们在暂存站点上启用了基于 cookie 的持久性,虽然我们验证了持久性 cookie 在浏览器中通过,但我的页面仍然无法按预期工作。我们将负载均衡器切换为使用基于客户端 IP 的持久性,然后它似乎确实在暂存。将在生产中实施相同的操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多