我创建了一个将在Web场上部署的在线购物网站。因此,我决定使用ASP.NET提供的Stateserver Session Management。现在,我有一个登录页面。用户成功登录后,我将其重定向到目录页面,随后他可以将书籍添加到他的购物车中。
根据我的理解,会话以键值对的形式存储。所以,如果我为特定用户创建一个Session(比如说他的名字是“abc”)那么我会做这样的事情:
Session["abc"]=tmp; //where tmp is a "List" of items that "abc" has added to the cart
现在,在将其重定向到另一个页面后,如何检索此会话?根据我的阅读,我将不得不写:
temp=Session["abc"]
如何将此用户名作为参数发送到其他页面。因为,这是在Web服务器场上,客户端可以连接到每个请求的不同服务器,并且可能有多个客户端同时登录。因此,如果我使用各自的用户名作为密钥为所有人创建会话,那么当他们浏览不同的页面时,如何检索他们的会话?
我认为我不了解会话ID的确切工作,所以如果有人可以帮助我,那就太棒了。
答案 0 :(得分:1)
如果您没有使用粘性会话(意味着创建会话后,您的负载均衡器会将请求始终保持在同一个框中),那么您需要确保在web.config中配置了OutOfProc状态提供程序指向运行ASP.NET状态服务的服务器的IP地址 - 默认情况下,它指向localhost -
此外,您需要确保您在Session中放置的所有内容都是Serializable(即使用[Serializable]属性装饰您的类)
根据我的经验,我总是看到在负载均衡器上打开粘性会话,因为这是最简单的方法。如果没有使用粘性会话,那么我可能会使用SQL状态提供程序或其他东西(其他一些可以更快地执行de / serialization的产品)来处理它。
答案 1 :(得分:0)
如何将此用户名作为参数发送到其他页面。
您无需发送。 Session对象不是页面响应的一部分,它位于服务器端。因此,您可以在页面A上进行设置,并使用您提供的相同代码在页面B上进行检索:
Session["abc"]=tmp;
和
temp=Session["abc"]
所以,如果我为他们所有人创建一个会话 用户名作为键,如何检索它们的会话 浏览不同的页面?
您可以使用用于在会话中存储对象的相同密钥来检索它。事实上,您可以为所有用户使用相同的密钥。例如:
username=Session["username"]
注意: .Net将使用分配给每个用户的唯一标识符(用户的SessionId)为每个对象检索正确的实例。但是,这对您的代码是透明的。
This question列出了使用StateServer Session
时的一些问题