cachingVS会话VS Cookie?

什么是做什么和不该做什么关于cachingVS会话VS Cookie?

例如:
我使用会话variables很多,有时在预订应用程序时遇到问题,当用户开始订购产品,然后去午餐,几个小时后回来继续预订。 我在会话中存储预订,直到用户确认或中止预订,所以当用户只需单击浏览器中的X并且不再返回时,我不需要与数据库交谈并处理数据库中的中途预订。

我是否应该使用caching或cookies或一些组合呢?

(当应用程序出现错误时,会话对象会自行重置,因此我会遇到更多问题)

我主要是做桌面编程,觉得我缺乏这方面的知识,所以任何人谁可以扩大在哪里使用caching,会话,cookies(或分贝)将不胜感激

编辑:从答案看来,数据库和cookies的组合是我想要的。

  1. 我必须在连接到session-id的数据库中存储预订
  2. 将session-id存储在cookie中(encryption)。
  3. 每页加载检查cookie并从数据库中获取预订
  4. 我有一个清理程序,每周运行一次,清除未完成的预订。

我无法将预订存储为cookie,因为用户可以更改价格和其他敏感数据,我必须validation所有内容(不能信任数据)。

我知道了吗?

并感谢所有人的伟大的解释!

当从桌面应用程序的angular度来到networking世界时,状态pipe理是掌握重要的事情。

  • Session用于存储服务器上当前Web会话的每个用户的信息。 它支持使用数据库服务器作为后端存储。
  • 应该使用Cookie来存储当前Web会话的每个用户信息或客户端上的持久信息,因此客户端可以控制cookie的内容。
  • Cache对象在单个应用程序中的用户之间共享 。 其主要目的是caching来自数据存储的数据,不应该被用作主存储。 它支持自动失效function。
  • Application对象在用户之间共享以存储应用程序范围的状态,并应该相应地使用。

如果您的应用程序被许多未经validation的用户使用,我build议您将数据存储在cookie中。 如果需要身份validation,则可以手动将数据存储在数据库中,也可以使用ASP.NETconfiguration文件pipe理function。

Web本质上是断开连接的模式,并没有任何提到的选项(会话,应用程序,caching等)足够可靠。 会话超时,工作进程回收等

如果您真的需要将用户的进度存储起来,可靠并且延长时间,那么数据库是您唯一的解决scheme。 如果你有用户configuration文件(如果用户必须login),那么它很简单。 如果不是,则生成一个唯一的ID,将其存储在cookie(或URL)中,并根据该标识跟踪用户。

只要确保Id是encryption的,然后base64编码的string,而不只是一个数字值。

编辑:

在对Mehrdad Afshari的原始问题和评论进行额外的解释之后,对你来说最好的解决scheme是使用Session,但将存储设置为Sql Server而不是InProc。

这里有更多的细节和说明如何设置: http : //msdn.microsoft.com/en-us/library/ms178586.aspx

请记住,您仍然有会话超时,但它们将在应用程序池回收,即使服务器重新启动时仍然存在。

如果您确实需要永久性存储,则使用数据库自​​定义解决scheme,正如我原先概述的那样是唯一的解决scheme。

您不应该使用Cache-object来caching会话数据,因为caching是在所有用户之间共享的。 相反,您可以使用Asp.Net configuration文件属性来存储数据,或者您可以将事件处理程序添加到Session_End事件中,并在用户离开计算机太久时存储数据。

第一个cookie被会话使用:服务器知道谁是你的用户,这要归功于客户端和服务器之间在每个请求之间交换的cookie(这与HTTP头set-cookie和cookie协同工作)。

真正的问题是:如果要在导航USE会话期间存储用户信息。 如果客户端不支持cookie,则可以决定将cookie存储在每个请求中,并在URL中进行编码(服务器将使用URL而不是cookie来为请求find正确的会话)。

然后考虑要存储会话的位置:如果您的站点必须具有较高的disponibility和较高的性能,则不能将会话存储在stream程中,而是存储在数据库中。 这样你就可以在几个networking服务器之间共享工作。 但是你会简单地放松(因为你存储在会话中的对象必须是可序列化的),并且你的web服务器和你的数据库服务器之间还有一次往返。

会话存储在服务器上会在20分钟内默认超时(这是可调的)。 我将它存储在一个cookie,或视图状态(如果可用),以防止超时。

如果您的状态存储在InProc(默认设置)中,那么在服务器场中有多个服务器也会导致您的问题,除非您已经实施某种“粘滞会话”,将用户保持在同一服务器上农场接下来的电话。

尽可能避免会话(在服务器上增加额外的负载和内存使用),并尽可能保持viewstateclosures,以保持页面大小。 Cookie通常是最轻量级的select,但是您的用户可能会closures此function,您将需要一个仍然允许他们使用该站点的后备模式。

编辑 (根据提问者的回复添加说明):

Viewstate存储在隐藏字段中,是ViewState存储中所有对象的序列化表示。 Viewstate自动用来存储页面的状态,但是如果你愿意的话,你可以通过编程的方式明确地添加和检索自己的对象。

所以是的,数据集可以存储在Viewstate中。

Cookies存储在浏览器中作为文本文件格式,存储的数据量是有限的,只允许4KB [4096字节] ,不在cookie中保存多个variables。

我们可以很容易地访问cookie的值,所以它的安全性不高 .setcookie ()函数必须在标签之前出现。

会话存储在服务器端,存储的数据量不受限制,在会话中保存多个variables。 我们无法轻松访问cookie值,因此更安全

链接: cache-vs-session-vs-cookies