我知道有关于如何在您的网站中实施购物车的问题有一百万个问题。但是,我认为我的问题可能有所不同。我目前有一个工作购物车,我在1.1天内写回来使用ASP.NET会话变量来跟踪所有内容。这已经实施了大约6年,并且很好地实现了它的目的。但是,它已经到了升级网站的时候了,而我所承担的部分工作就是创建一个更加用户友好的网站。部分原因是删除了updatepanel
并实现了真正的AJAX解决方案。
我的问题出现在我需要将这个购物车坚持几页的地方。当然我可以使用cookies,但我想跟踪推车用于统计目的(放弃统计数据,添加但未购买的物品,这些类型的统计数据)以及用户友好性,例如坚持他们的购物车,以便他们回来它被记住了。如果用户已登录,这很容易,但我不想强迫用户创建帐户,如果他们不想要。
此外,我们处理订单的方式有点,呃,一起打耳光。所有细节(选择的颜色,选择的类型等)都通过他们的描述字符串传递给paypal,大部分都是好的,但如果产品的选择对于字符串来说太长(我相信255个字符),他们会被切断,我们必须打电话给客户确认他们买了什么。如果我要实施一个更“稳固”的购物车,我们就不必这样做,因为除了自动输入订单处理系统的订单之外,所有客户的选择都将被存储(它们被手动输入一个excel电子表格。我知道,对吧)。
我想以正确的方式做到这一点,但我不想使用任何过于夸张的软件,这些软件不适用于我们当前的商业模式。我是否使用cookie来“标记”每个访问者以使他们与他们的购物车匹配(给他们一个带有GUID的cookie),保持他们的整个购物车客户端,保持购物车服务器端并且只从每个访问者的数据库中取出它页面刷新?任何帮助将不胜感激。
谢谢!
答案 0 :(得分:3)
所以这不是真的你问题的答案,但这是答案的一部分。我试图找到它的副本(它可能不是),但如果你使用IRequiresSessionState,你可以保留很多相同的代码。我没有发现任何确切的重复,但我认识到了主题。
Handler with IRequiresSessionState does not extend session timeout
其他答案:
ASP.NET: How to access Session from handler?
Authentication in ASP.NET HttpHandler
所以你真正想做的只是在你的页面中实现PageMethods,然后你可以减少很多与页面通信的开销。但是如果你想要从你现在正在做的事情中迁移你想要开始实现处理程序(并将它们配置为使用JSON - 那里有一个装饰器),你可以使用jQuery.ajax()
之类的直接URL并将其保持在项目的同一范围内。请注意,默认情况下会为您发送cookie,因此没什么大不了的。我之所以这么说是因为cookie具有来自Forms的标识符以便识别会话。
因此,如果您正在使用IRequireSessionState,那么您仍然可以使用您习惯使用的所有会话状态信息。将Session与AJAX结合使用没有任何问题。两者真的没有很多关系。一个用于服务器存储,另一个用于服务器通信。
现在,如果您正在尝试完全客户端应用程序和RESTful服务器解决方案,那么您将需要开始来回传递复杂的JSON结构(这不是什么大问题,只需要确保您在你自己的文档中为你自己定义你的数据类型)你可以将所有内容限制在仅通过的内容。
我实际上在同一台服务器上的应用程序中使用了这三种类型的这些方法,具体取决于我正在尝试对每个应用程序执行的操作。我发现每个人都有自己的优点和缺点。 (好吧,我不使用会话部分,因为我以其他方式处理我的状态,但我可以使用会话状态)
我可以在这里澄清一下吗?
答案 1 :(得分:2)
有几种方法可以解决这个问题。主要问题是你需要多长时间来保存他们的购物车信息(30分钟,1小时,1天,1周......等)。
短存储要求最简单的实施(30分钟 - 1小时)
您可以使用HttpContext.Current.Session["key"]
将会话与页面方法结合使用,这样您就可以保持会话存储与当前适用的会话存储相同。您可以非常轻松地使用jquery ajax调用这些页面方法,并且无需更新面板,脚本管理等等。因此,在我看来,它会让您到达中途。您的页面加载速度更快,响应更快,您不必丢弃任何与会话缓存相关的代码。这样做的主要缺点是你仍在使用会话,所以你真的不想长时间坚持会话,因为如果网站服务器相当活跃,它会使服务器陷入困境。
长期存储要求服务器端实施
除了您没有使用会话之外,上述相同的内容适用,如果您愿意,可以使用无状态Web服务。您将为每个访问者生成GUID并将该GUID存储在cookie中。在每个ajax调用上,您将发送此GUID以及要保留的数据。此信息将存储在GUID标识的数据库中。如果客户完成订单,则可以将信息从缓存数据库移动到已完成的订单数据库。在此实现中,您可能希望编写一些服务或计划作业,这些作业将在一定时间后删除缓存订单(未完成)以保持缓存数据库的精简。
这个解决方案的好处是你可以拥有一个相当长的缓存,编写一些关闭这个缓存数据的报告,并减少web服务器上的负载。此外,如果您的网站变得更受欢迎,则可以轻松扩展,因为您不必担心在多个Web服务器之间保持会话同步。
长期存储要求客户端实施
此方法仍使用Web服务或页面方法,但不涉及缓存数据库。基本上,你将所有信息都塞进一个cookie或一组cookie中,并将其关键。如果您在每个POST上读出cookie的内容并存储在某个地方进行报告,您仍然可以获得一些信息。
如果您不需要跟踪客户添加的内容但没有订购,那么此解决方案的主要好处是您可以减少必须减少的POST数量。您可以使用javascript写入cookie,并在完成订单时将所有内容POST。请注意不要在未加密的cookie中添加任何敏感信息(联系信息,账单信息,等等),因为有些方法可以在一些不太安全的浏览器中从其他域挖掘cookie中的数据。对于敏感的东西,您可以将其POST到服务器并让它返回加密的信息以存储在cookie中。
此解决方案的缺点是,如果您需要存储的信息很大,则可能会遇到每个域限制的最大cookie大小和/或最大Cookie数量。有了一个好的策略(即存储产品ID而非产品描述),您可能会没事。
如果上述任何内容不清楚或者您还有其他问题,请与我们联系。
编辑:没有看到上面的答案基本上列出了我的短存储要求。如果这是接受的解决方案,给他一个复选标记(他打败我(=)。留下我的答案,因为它列出了一些额外的选项。