【发布时间】:2010-06-28 15:07:31
【问题描述】:
我们有一个 asp.net 应用程序,它为跨页面的单个用户使用会话(进程内),现在他们希望保持数据(例如购物车)更加持久,即使他们离开网络应用程序,也意味着关闭浏览器,下次登录时使用相同的ID,他们想要返回数据,ASP.NET中有什么解决方案吗?
如果我们在 sql-server 中保存会话,我认为这是微软的一个选项,但我不确定即使在用户离开应用程序或关闭浏览器后它是否有效
【问题讨论】:
我们有一个 asp.net 应用程序,它为跨页面的单个用户使用会话(进程内),现在他们希望保持数据(例如购物车)更加持久,即使他们离开网络应用程序,也意味着关闭浏览器,下次登录时使用相同的ID,他们想要返回数据,ASP.NET中有什么解决方案吗?
如果我们在 sql-server 中保存会话,我认为这是微软的一个选项,但我不确定即使在用户离开应用程序或关闭浏览器后它是否有效
【问题讨论】:
会话数据仅在该浏览器会话的生命周期内持续存在。
答案是不在会话中保存数据,而是将其保存在ShoppingCart 和ShoppingCartItem 表中的数据库中。只要您愿意,它们就会一直存在。
ShoppingCart 表将有一个 UserID 列,即 FK 到您的 User 表。
【讨论】:
您需要构建一个关系数据库并将条目存储在其中。
当然,Application 范围高于 Session,但它只会在应用程序池的生命周期内存在。听起来您正在寻找永久存储空间。
【讨论】:
我见过使用 cookie 的购物车系统,有些同时使用 cookie 和数据库。
仅限 Cookie:Cookie 的“官方”大小为 4K
Cookie + 数据库:在 cookie 中存储一个 GUID,并将其用作数据库中的引用
但是...我认为将购物车存储在 cookie 或 cookie/数据库中对用户不是很友好。如果我离开,我更喜欢网站忘记我的购物车。当网站在我同意的情况下存储此类信息时,我很生气。
【讨论】:
您将需要使用数据库来镜像会话中包含的数据,这样数据将在用户注销、重新启动应用程序或重新启动服务器后保留很长时间。您可以将会话对象作为二进制对象保存到 sql-server 中,并在需要时进行序列化/反序列化,但是您如何知道何时进行初始序列化?如果用户关闭浏览器窗口,则很难判断用户何时注销。
暂时将会话对象存储为单个列可能会起作用,但从长远来看,您可能希望提出适当的关系设计并将数据存储在表中的列中,这样您就可以运行查询和报告反对“进行中的”购物车(例如:人们在最终结账之前让购物车坐多长时间?)。
正如其他人所提到的,cookie 是另一种选择,但它们存在于客户端,如果他们决定清除 cookie(当用户抱怨浏览器速度慢时,许多技术支持人员似乎将此建议作为第一反应) ,购物车丢失。
【讨论】: