【发布时间】:2010-12-04 18:25:14
【问题描述】:
我正在使用 outputcache 页面指令来缓存基于 VaryByParam 的值。有没有一种方法可以在 Web 应用程序启动时为一组常用参数预填充缓存,而不必等待用户点击页面?还是我只需要编写一个脚本来访问我想要缓存的所有页面?理想情况下,我可以在 global.asax application_start 的某个服务器端执行它?
【问题讨论】:
标签: asp.net caching outputcache
我正在使用 outputcache 页面指令来缓存基于 VaryByParam 的值。有没有一种方法可以在 Web 应用程序启动时为一组常用参数预填充缓存,而不必等待用户点击页面?还是我只需要编写一个脚本来访问我想要缓存的所有页面?理想情况下,我可以在 global.asax application_start 的某个服务器端执行它?
【问题讨论】:
标签: asp.net caching outputcache
显然您现在热衷于解决方案,但请看看 ASP.NET 4 中的新功能。有两个新增功能可能会对您有所帮助。
第一个是为 ASP.NET 应用程序指定“预热”逻辑的能力 - 您可以在 web.config 中配置它,并有选择地告诉它运行实现 IProcessHostPreloadClient 的代码。详情见这里:http://weblogs.asp.net/scottgu/archive/2009/09/15/auto-start-asp-net-applications-vs-2010-and-net-4-0-series.aspx
第二个是您将获得一个适当的输出缓存提供程序模型。到目前为止,只有一种选择:在工作进程中缓存。因此,每次进行回收时,您都会丢失缓存(当然,您会受到内存限制的限制)。在 ASP.NET 4 中,您也可以获得开箱即用的基于磁盘的缓存。详情见这里:http://www.asp.net/learn/whitepapers/aspnet40/#_TOC1_2
【讨论】:
过去我使用过热身脚本
http://programmerramblings.blogspot.com/2008/09/aspnet-site-warmup.html
这样的解决方案基本上会“ping”每一个页面。此“ping”将导致您的缓存被激活。它还将防止用户访问冷网站,以便在他们到达那里时页面将完全被淘汰。
编辑:我仍然不知道我对以下解决方案的味道有何感受,但是在应用程序启动时向每个页面触发 Web 请求怎么样?
string[] cachedPages = new string[] { "http://...", "http://...", ...};
foreach (var url in cachePages) {
var request = WebRequest.Create(url);
request.BeginGetResponse(null, null);
}
【讨论】:
为什么要在有人真正请求它们之前缓存它们?这不是也消耗资源吗?
我不确定您是否真的可以像您所说的那样动态缓存页面,但您可以在 Global.asax 文件中将对象添加到缓存中。
void Application_Start(object sender, EventArgs e)
{
}
【讨论】: