【问题标题】:How Do I prepopulate the outputcache in an asp.net web application?如何在 asp.net Web 应用程序中预填充输出缓存?
【发布时间】:2010-12-04 18:25:14
【问题描述】:

我正在使用 outputcache 页面指令来缓存基于 VaryByParam 的值。有没有一种方法可以在 Web 应用程序启动时为一组常用参数预填充缓存,而不必等待用户点击页面?还是我只需要编写一个脚本来访问我想要缓存的所有页面?理想情况下,我可以在 global.asax application_start 的某个服务器端执行它?

【问题讨论】:

    标签: asp.net caching outputcache


    【解决方案1】:

    显然您现在热衷于解决方案,但请看看 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

    【讨论】:

    • 我不相信您可以开箱即用地获得基于磁盘的缓存。 Microsoft 从未发布基于磁盘的缓存 - 您必须编写自己的 System.Web.Caching.OutputCacheProvider 实现。
    【解决方案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);
    }
    

    【讨论】:

    • 是的,这会起作用,但这意味着热身脚本不是 application_start 的一部分,这是我想要的理想位置。如果 IIS 重新启动会怎样?我的情况是我无法控制网站所在的盒子,所以我希望所有内容都包含在服务器应用程序中。
    • 我只能想到 hacky 类型的方法来在应用程序启动时获取它。根据页面和站点的流量,我可能会在本地计算机上创建一个计划任务,以频繁地 ping 站点。
    • 我已经更新了我的答案以显示一些简单的代码来从应用程序启动进行热身。看起来它应该可以工作,但我觉得有些不对劲。
    • 嗯,这可以工作,虽然它感觉有点递归或什么的——我也不知道来自服务器的出站 http 请求的限制。我认为那里有一个节流阀。将进行调查并做出回应。
    • 如何在 Application_Start 中设置 Timer 或添加 Cache 条目(并挂钩 expire 事件),并让该回调执行需要预热的页面的迭代?这将允许您自动触发,同时仍会在 AppStart 处延迟少量。
    【解决方案3】:

    为什么要在有人真正请求它们之前缓存它们?这不是也消耗资源吗?

    我不确定您是否真的可以像您所说的那样动态缓存页面,但您可以在 Global.asax 文件中将对象添加到缓存中。

    void Application_Start(object sender, EventArgs e) 
    {
    
    }
    

    【讨论】:

    • 好吧,在这种情况下,我碰巧知道他们会要求什么。是的,我知道我可以添加缓存变量,但我想添加到输出缓存中。
    • 正如他所提到的,他希望使用一组通用值预填充缓存——他知道的东西将被请求。这样,当用户实际使用该请求访问网站时,该用户在获取和缓存项目时不会遇到延迟。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 2012-06-02
    • 2018-07-05
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 2013-10-23
    相关资源
    最近更新 更多