错误会话的用户
问题描述:
我发现了描述类似于我的问题但不够近的文章。我有一个非常间歇性的问题,一个用户可以登陆另一个用户会话,最终看到他们存储在会话中的一些信息。以下是我的场景:我们在使用应用程序请求路由和Web场架构的负载平衡环境中使用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直接从会话状态直接返回对象,我没有看到问题。
答
在网络农业场景中,您需要离开inproc会话。您需要使用进程外会话存储以确保Session ID
是唯一的。
ASP.NET将其Session ID
存储在浏览器的Cookie集合中。如果用户具有相同的Session ID
,他们的会话将与服务器显示相同。在同一台服务器上使用单独的服务器甚至工作进程可能会导致这些类型的冲突。
您可以通过MSDN on various Session-State modes supported by ASP.NET获取更多详情。
我同意,如果两个用户最终在同一台服务器上使用相同的ID,他们会看到相同的数据,因为服务器将它们视为同一用户。然而,在我的情况下,这将要求ARR弄乱并且在第二个用户分配第二个用户不同的服务器之后将第二个用户发送到第一个用户服务器。如果他们被分配了相同的服务器,那么负载平衡就无关紧要了,因为这意味着一台服务器给了两个用户相同的会话ID。 ARR是否有这样的问题?它会解释我断断续续地发生的状态验证错误。 – 2012-07-05 22:32:18
我应该提一下,我们已经用一个aspx文件测试了我们的ARR亲和力,该文件向您显示了您登陆的服务器。您可以重新加载它,但是直到亲缘关系cookie丢失或删除,您总是会在同一台服务器上结束。 – 2012-07-05 22:33:40
我们已经切换到在SQL中存储会话状态。它似乎按预期工作。如果我们今后不再有这些问题,我会将其标记为答案。谢谢您的帮助!! – 2012-07-09 19:30:12