Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.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中使用WCF服务,如何缓存?_C#_Asp.net_Wcf - Fatal编程技术网

C# 在ASP.NET中使用WCF服务,如何缓存?

C# 在ASP.NET中使用WCF服务,如何缓存?,c#,asp.net,wcf,C#,Asp.net,Wcf,在这种情况下,我有两种情况: 我想查询一个WCF服务并将数据保存在某个地方,因为其中一个网页是基于从该服务检索到的数据进行呈现的。我不希望页面本身查询服务,但我更希望有某种调度工作程序,每隔几分钟运行一次,检索数据并将其保存在某处 我应该将服务响应缓存在哪里?创建任务以每隔几分钟查询一次服务的正确方法是什么 我想我可以通过将响应保存到一个静态变量中,与最后一个查询日期一起保存,然后检查页面负载,如果经过足够的时间,我调用服务并刷新数据,否则我使用静态缓存 这也解释了长时间没有用户访问该页面,并且

在这种情况下,我有两种情况:

我想查询一个WCF服务并将数据保存在某个地方,因为其中一个网页是基于从该服务检索到的数据进行呈现的。我不希望页面本身查询服务,但我更希望有某种调度工作程序,每隔几分钟运行一次,检索数据并将其保存在某处

我应该将服务响应缓存在哪里?创建任务以每隔几分钟查询一次服务的正确方法是什么

我想我可以通过将响应保存到一个静态变量中,与最后一个查询日期一起保存,然后检查页面负载,如果经过足够的时间,我调用服务并刷新数据,否则我使用静态缓存

这也解释了长时间没有用户访问该页面,并且站点没有徒劳地查询服务的情况


但这似乎有点粗糙,有没有其他更好的方法来完成这类任务?

您是否已经看过了

您确实可以采取另一种方法,比如让一个计划的程序查询信息,并将其放入可供服务器场中所有web服务器使用的内存缓存中。然而,这是否更适合你的场景取决于你的应用程序的大小以及你想在上面花费多少时间/精力

内存中缓存比静态变量更难实现/支持,但有时会更好,因为每次服务器重置时(例如,在X分钟不活动后)都可以清除静态变量


根据系统的大小,我将从静态变量开始,试驾该方法一段时间,然后决定是否需要更复杂的东西。

Nico:为什么不编写一个简单的控制台守护程序,获取数据并将其存储在数据库中,然后让web应用程序从本地副本获取数据?您可以让该控制台应用程序每隔一定时间运行一次。如果您使用的是sql server 2008,则插入数据应该不会有问题。您可以将datatable参数传递给存储的进程,并在一次调用中插入整个表。如果不使用SQLServer2008,则序列化web服务返回的整个集合,并将其存储在一个大blob列的表中,并记录获取数据时的时间戳。然后,您可以读取该列的内容,反序列化集合,并将其重建为本机对象以显示在页面上

我从未见过(我认为这是不可能的)让你的web应用程序每隔一定时间查询web服务。想象一下,该网站闲置数小时,因此没有任何人的交互。这意味着不会触发任何事件,也不会查询任何内容


或者,您可以创建一个虚拟页面,每隔一定时间执行一个javascript函数,并让该javascript函数向服务器发出ajax请求,以从web服务获取数据并缓存数据。问题是,当您走出该页面时,什么也不会发生,您将停止查询web服务。我认为这很愚蠢。

FYI:发布名称是“Windows Server AppFabric缓存”(我更喜欢Velocity)。Velocity方法看起来很简洁,但似乎有点过头了。我想你需要一台专用的服务器来运行服务,还要做很多设置。不过,为什么我要获取没有人呈现的数据呢?别问我,问问你自己这个问题。你是说你需要定期缓存数据的人,即使网站上没有任何活动。不,不。对不起,如果我让它看起来像那样,我的意思是相反的。如果没有人试图呈现使用此信息的页面,我不希望网站查询该服务,因为这毫无意义。我明白了。如果是这种情况,只要您有对System.Web的引用,就应该能够通过指定HttpRuntime.Cache来使用ASP.NET缓存类。实际上,使用它并不需要当前的HttpContext。您可以缓存特定的时间跨度,仅此而已。如果对象在缓存中已过期,则再次查询Web服务。此外,还可以使用企业库缓存应用程序块。请看这篇文章:如果您想变得非常聪明,可以使用CLR存储过程来使用按预定时间间隔运行的服务,然后使用SqlCacheDependency:D