我正在使用 outputcache 页面指令来缓存基于 VaryByParam 的值。有没有一种方法可以在 Web 应用程序启动时为一组常用参数预填充缓存,而不必等待用户点击页面?还是我只需要编写一个脚本来访问我想要缓存的所有页面?理想情况下,我可以在 global.asax application_start 的某个地方进行服务器端操作?
3 回答
显然,您现在热衷于解决方案,但请看一下 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)
{
}