当尺寸限制开始时,cookie的最佳替代品

时间:2014-07-29 16:59:38

标签: c# asp.net cookies

我一直在使用相当庞大的数据库。我想在pageload事件期间填充页面的webcontrols(下拉列表),以便为网页提供尽可能多的灵活性。例如,我有一个用户可以选择的下拉列表,它将从数据表的特定列的唯一行中填充。

现在,我不希望每次页面加载时都发出oracle查询,因​​为这会显着减慢网页速度(每次大约1分钟)。所以我开始将cookie视为解决方案。我很快发现cookie大小(4kb)的限制对我来说太小了。如果我真的想在本地存储数据行,我将需要大约10-15kb的大小!所以我试图搜索是否有任何方法来增加cookie大小限制以满足我的需求,我发现可能的解决方案是localstorage。

  1. 真的有办法增加cookie大小限制吗?
  2. 最简单的选择是什么?它真的是本地存储吗?或者还有什么需要研究的吗?
  3. 详细信息:我正在使用C#/ ASP.NET + ORACLE

3 个答案:

答案 0 :(得分:3)

以下是ASP.Net中所有状态信息的存储选项 -

  • 缓存 - 存储在服务器上并在用户之间共享的内存池
  • 会话 - 存储在服务器上,每个用户都是唯一的
  • Cookie - 存储在客户端上并随每个HTTP请求一起传递到服务器
  • QueryString - 作为完整网址字符串
  • 的一部分传递
  • Context.Items - HttpContext并且仅持续该请求的生命周期
  • 个人资料 - 存储在数据库中并维护多个会话的信息
  

现在,我不希望每次页面加载时都触发oracle查询   因为这会显着减慢网页速度(大约1分钟   每次)。

你有两种选择 -

  • 如果用户之间共享数据,请使用缓存
  • 如果每位用户的数据都是唯一的,请使用会话

理想情况下,您不希望存储在 ViewState 中,除非您配置为在Sql Server中存储ViewState(这超出了此问题的范围),否则它将使您的页面非常繁重

更新

localStorage - 并非所有浏览器都可以处理localStorage,因此请务必先检查它。

<script type="text/javascript">
   if(window.localStorage)  {
      window.localStorage.SetItem('keyName','valueToUse');
      // OR
      window.localStorage.keyName = 'valueToUse';
   }
</script>

仅供参考: ASP.NET不提供处理本地存储的特定方法;你只能通过javascript在客户端进行操作。

答案 1 :(得分:0)

您不想使用Cookie。

我在我一直在努力的应用程序中有类似的要求。我需要让用户使用自动完成输入框从~15,000个选项中选择一个值。每次组件需要查找值时,我都不想访问数据库。我决定使用会话存储来存储所有可能的值,然后将这些值提供给自动完成组件。它很棒。您也可以使用本地存储。

根据我的需要,会话存储是一个更好的选择,因为我不需要在用户关闭浏览器选项卡后保持值。此外,在我将15,000个项目存储在会话存储中之前,我使用JavaScript压缩来压缩它们以节省空间。我正在使用lz-string进行压缩。

答案 2 :(得分:0)

您不希望为此目的使用Cookie。不仅有大小限制,而且每次向服务器发出请求时都会来回发送cookie,这可能会降低应用程序的响应速度,具体取决于您的服务器和用户的带宽。

另一种方法是使用Viewstate将数据存储在页面本身上。这没有空间限制,但它确实与增加请求大小的cookie有相同的问题。

您还可以使用Session将每个会话的数据存储在服务器的内存中。这降低了带宽要求,但确实占用了服务器本身的额外内存空间,这可能并不理想。内存中的大量数据+大量会话可能会导致内存不足。

因此,弄清楚你的特定权衡是什么。 Viewstate与您当前的解决方案最相似。

要访问您网页中的视图状态或会话,只需执行Viewstate['KEY']Session['KEY']

需要注意的另一件事是,Session数据会在整个会话期间以及跨页面加载/重定向/等等时保留。 Viewstate仅适用于该页面。如果您转到另一个页面,Viewstate将被丢弃。

如果所有用户的数据都相同,那么您还可以使用Cache,它将数据存储在应用程序级别而不是会话级别。这仍占用服务器上的内存空间,但不会随着会话的增加而增加(在你的情况下仅为15k!)。您还可以指定缓存的过期时间(滑动或绝对),如果在一定时间内未访问该资源,则可以自动释放正在使用的内存。在使用之前,请确保始终检查数据是否在缓存中,因为如果信息过期,.NET将丢弃该信息,或者只是为了其他目的而需要清理内存。