用户错误的会话

时间:2012-07-05 21:34:51

标签: asp.net session caching load-balancing

我发现的文章描述的问题与我的相似但不够接近。我有一个非常间歇性的问题,一个用户可以登陆另一个用户会话,最终看到他们存储在会话中的一些信息。这是我的场景:我们使用应用程序请求路由和Web Farm Framework在负载平衡的环境中使用AbleCommerce。我们使用进程内会话,但我们配置了粘性会话(客户端/服务器亲和性)并且正在工作。我已经验证没有缓存导致此问题(没有使用页面输出缓存,没有ARR缓存,没有IIS或WAAS缓存)。存储在会话中的信息偶尔会出现在某个浏览器上,并通过基于会话的单例对象存储在会话中。

例如:

public class ExampleObject
{
    public string ExampleData{get; set;}

    public static TicketingSession Instance
    {
        get
        {
            if (HttpContext.Current.Session["ExampleObject"] == null)
            {
                HttpContext.Current.Session["ExampleObject"] = new ExampleObject();
            }
            return (ExampleObject)HttpContext.Current.Session["ExampleObject"];
        }
    }
}

然后在其他一些代码中我可以使用它:

ExampleObject.Instance.ExampleData = "whatever";
//or
txtSomeTextBox.Text = ExampleObject.Instance.ExampleData;

我知道我应该在负载平衡的环境中避开静态数据和进程内会话,但由于我使用的是客户端/服务器亲和性,因为我使用的这个静态对象只是getter的一个属性,只是返回对象直接来自会话状态我没有看到问题。

1 个答案:

答案 0 :(得分:4)

在Web种植场景中,您需要远离inproc会话。您需要使用进程外会话存储来确保Session ID是唯一的。

ASP.NET将其Session ID存储在浏览器的cookie集合中。如果用户具有相同的Session ID,则他们的会话将对服务器显示相同。在同一服务器上使用单独的服务器甚至工作进程可能会导致这些类型的Session ID冲突。

您可以通过MSDN on various Session-State modes supported by ASP.NET获取更多详细信息。