0

我创建了一个在线购物网站,该网站将部署在网络农场上。因此,我决定使用 ASP.NET 提供的 Stateserver 会话管理。现在,我有一个登录页面。用户成功登录后,我将他重定向到目录页面,他随后可以将书籍添加到他的购物车中。

据我了解,Session是以键​​值对的形式存储的。所以,如果我为特定用户创建一个会话(比如他的名字是“abc”),那么我会做这样的事情:

Session["abc"]=tmp; //where tmp is a "List" of items that "abc" has added to the cart

现在在他被重定向到另一个页面后,我如何检索这个会话?根据我的阅读,我必须写:

temp=Session["abc"] 

如何将此用户名作为参数发送到另一个页面。由于这是在网络场上,因此客户端可以针对每个请求连接到不同的服务器,并且可能有多个客户端同时登录。因此,如果我使用他们各自的用户名作为键为他们创建一个会话,当他们浏览不同的页面时,我如何检索他们的会话?

我认为我不了解会话 ID 的确切工作原理,所以如果有人可以帮助我,那就太好了。

4

2 回答 2

1

如果您没有使用粘性会话(意味着一旦创建会话,您的负载均衡器将始终将请求保持在同一个框),那么您需要确保在 web.config 中将 OutOfProc 状态提供程序配置为指向运行 ASP.NET 状态服务的服务器的 IP 地址 - 默认情况下,它指向 localhost -

此外,您需要确保您放入 Session 中的所有内容都是可序列化的(即使用 [Serializable] 属性装饰您的类)

根据我的经验,我总是看到在负载均衡器上打开粘性会话,因为这是最简单的方法。如果不使用粘性会话,那么我可能会使用 SQL 状态提供程序或其他东西(可以更快地进行反序列化的其他产品)来处理这个问题。

于 2013-03-19T07:30:34.863 回答
0

如何将此用户名作为参数发送到另一个页面。

你不需要发送它Session对象不是页面响应的一部分,它位于服务器端。因此,您可以在页面 A 上设置它,并能够使用您提供的相同代码在页面 B 上检索它:

Session["abc"]=tmp;

temp=Session["abc"] 

因此,如果我使用他们各自的用户名作为键为他们创建一个会话,当他们浏览不同的页面时,我如何检索他们的会话?

您可以使用在会话中存储对象时使用的相同密钥来检索它。事实上,您可以为所有用户使用相同的密钥。例如:

username=Session["username"] 

注意: .Net 将使用分配给每个用户的唯一标识符(用户的 SessionId)检索每个对象的正确实例。但是,这对您的代码是透明的。

这个问题列出了使用 StateServer Session 时的一些问题

于 2013-03-19T07:30:04.090 回答