Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在ASP.NET中跨多个会话存储(缓存?)数据_C#_Asp.net_Session_Caching - Fatal编程技术网

C# 如何在ASP.NET中跨多个会话存储(缓存?)数据

C# 如何在ASP.NET中跨多个会话存储(缓存?)数据,c#,asp.net,session,caching,C#,Asp.net,Session,Caching,我正在编写一个C#ASP.NET Web表单应用程序。为了简洁起见,此应用程序从服务器检索数据并向用户显示 要访问此服务器,我的应用程序需要生成登录信息。生成登录信息需要几分钟。此登录信息每天都在更改,但对于使用我的应用程序的每个人(在特定的一天)都是一样的 我的应用程序每天将被数百人使用。让每个用户等待几分钟以获取登录信息对我来说是愚蠢的 理想情况下,我希望每天收集一次登录信息,并将结果存储在服务器上的某个位置 有什么建议吗?我知道.NET有缓存和会话,但它们只存储单个用户的数据。您是否有存储

我正在编写一个C#ASP.NET Web表单应用程序。为了简洁起见,此应用程序从服务器检索数据并向用户显示

要访问此服务器,我的应用程序需要生成登录信息。生成登录信息需要几分钟。此登录信息每天都在更改,但对于使用我的应用程序的每个人(在特定的一天)都是一样的

我的应用程序每天将被数百人使用。让每个用户等待几分钟以获取登录信息对我来说是愚蠢的

理想情况下,我希望每天收集一次登录信息,并将结果存储在服务器上的某个位置


有什么建议吗?我知道.NET有
缓存
会话
,但它们只存储单个用户的数据。您是否有存储此登录信息的技术,以便我可以从我的代码中获取它?

您错了,缓存在应用程序级别工作,而不是在用户级别,从

应用程序通常可以通过在中存储数据来提高性能 频繁访问且需要大量内存的内存 创建的处理时间。例如,如果您的应用程序处理 使用复杂逻辑的大量数据,然后以 对于用户经常访问的报表,避免 每次用户请求报告时重新创建报告。同样地, 如果应用程序包含处理复杂数据的页面,但 如果只进行不频繁的更新,则服务器进行更新的效率很低 在每次请求时重新创建该页面

为了帮助您在这些情况下提高应用程序性能, ASP.NET使用两种基本缓存机制提供缓存。第一 是应用程序缓存,允许您缓存生成的数据, 例如数据集对象或自定义报表业务对象。这个 第二个是页面输出缓存,它保存页面的输出 处理并重用输出,而不是重新处理页面 当用户再次请求页面时

我认为
应用程序缓存
比另一个更适合

关于到期

有两种方法可以控制它,您可以将X分钟设置为限制,然后根据需要进行设置:

  • 绝对:对象创建后X分钟后数据过期

    Cache.Insert("key", myTimeSensitiveData, null, DateTime.Now.AddMinutes(1), TimeSpan.Zero); 
    
  • 绝对有效期:这个 示例将时间敏感数据缓存一分钟,此时 缓存将过期的点。请注意,绝对过期和滑动 过期日期(以下)不能一起使用

  • 滑动:在上次用户使用缓存对象后X分钟后使数据过期

    Cache.Insert("key",myFrequentlyAccessedData, null, System.Web.Caching.Cache.NoAbsoluteExpiration,  TimeSpan.FromMinutes(1));
    
  • 滑动过期:此示例将缓存 一些常用数据。数据将保留在缓存中,直到 一分钟过去了,没有任何参考。请注意,滑动 过期和绝对过期不能一起使用


    示例来源:

    您能否将信息存储在数据库中,并使用预定的外部实用程序或服务进行更新?我认为让任何用户等待几分钟(通过web应用程序)来提取数据是一种不可取的解决方案,请看一看,您还可以使用AppFabric可扩展的快速缓存系统,也可以使用AppFabric版本替换标准ASP.NET会话,无需更改代码,只需简单更改web.config,这样它就可以使用AppFabric而不是标准ASP.NET会话状态谢谢。我之前看到过,但我仍然不理解
    缓存的生存期。即使没有人使用它,它也会持续吗?如中所述,如果我的web应用程序在任何时候都没有用户,
    缓存是删除自身还是保留在我的计算机内存中的某个位置?即使没有人使用它,它也会保留,直到应用程序池回收(这会破坏缓存)。查看过期策略以在该限制内获得更多控制。如果有一百个人在浏览器中打开了一个站点的页面,但在最近半秒钟内没有人单击任何内容,那么该站点当前有一百个用户,还是零用户?实际上,对于HTTP来说,说目前有X个用户是没有意义的。即使您对会话执行了一些有状态的操作,它仍然被视为一个请求一个请求。@JonHanna我认为有100个用户已登录,但与缓存主题相关,自从有人使用缓存对象(如果其中任何一个已经使用了对象缓存)以来,半秒钟已经过去了,因此如果时间限制设置为1分钟,数据将在59.5秒内过期缓存将适合他要存储的数据(只要数据的过期策略以及应用程序池的过期策略设置正确),但这里要注意的一个大问题是缓存是每个工作进程的。IIS通常配置为每个应用程序池生成多个工作进程,以更好地满足服务器用户请求。每个进程都将维护自己的缓存,每个缓存都需要运行多分钟的数据检索进程。