1

我发现文章描述了与我的问题相似但不够接近的问题。我有一个非常间歇性的问题,一个用户可以登陆另一个用户会话并最终看到他们存储在会话中的一些信息。这是我的场景:我们在负载平衡环境中使用 AbleCommerce,使用 Application Request Routing 和 Web Farm Framework。我们使用进程内会话,但我们配置了粘性会话(客户端/服务器关联)并且可以正常工作。我已经验证没有缓存导致这个问题(没有使用页面输出缓存,没有 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 只是直接从会话状态我没有看到问题。

4

1 回答 1

4

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

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

您可以通过MSDN 获得有关 ASP.NET 支持的各种会话状态模式的更多详细信息。

于 2012-07-05T21:44:38.053 回答