使用HttpResponse.RemoveOutputCacheItem删除输出缓存不适用于共享主机。网络表单

时间:2011-12-17 19:12:45

标签: asp.net caching webforms

我有一个缓存带有asp.net输出缓存指令的页面的应用程序。 当我从控制面板插入更新或删除somthing时,我想重置输出缓存。 本地我的算法效果很好。 当我在共享主机上运行它时,缓存不会清除。

我的算法很直接: 在global.asax中,我初始化一个列表,其中包含我使用输出缓存的所有页面。

OutputCacheHelper.Directories.Add(OutputCacheHelper.AllPagesKey, new List<string>() {
         "/Default.aspx",
       "/pages/DisplayContactForm.aspx",
       "/pages/PhotosGallery.aspx",
       "/pages/Schedule.aspx",
       "/pages/Shows.aspx",
       "/pages/cms/DisplayCategory.aspx",
       "/pages/cms/DisplayCategoryAlternative.aspx",
       "/pages/cms/DisplayFrontPage.aspx",
       "/pages/cms/ViewAirstaff.aspx",
       "/pages/cms/ViewArticle.aspx",
       "/pages/cms/ViewShow.aspx"
});

然后每当我从数据库插入/更新/删除数据时,我都使用上述算法:

        foreach (string directory in Directories[AllPagesKey])
        {

            HttpResponse.RemoveOutputCacheItem(directory);
        }

我不知道为什么这对共享主机不起作用。 请帮忙。 谢谢你,对不起我的英语。


修改

抱歉延误。 我正在出差。

我弄清楚了...... 不是我想要但我只能应用输出缓存。 (因为Azure不可用) 我在文件上添加依赖项,然后当我想清除缓存时,我只是对内容进行处理。 可以吗?

2 个答案:

答案 0 :(得分:2)

您的共享主机是单个服务器还是服务器群(如AZURE)? 缓存是服务器级别,因此在多实例上下文中,清除缓存不会影响其他服务器上的缓存。

EDIT
在多服务器环境中,您可以:
   - 使用共享缓存(AZURE提供它,但它需要花钱)
   - 创建一个管理缓存的系统(即使用数据库表存储每个对象的最后更新时间,以便任何服务器在查看缓存结之前必须重置)    - 避免使用缓存

答案 1 :(得分:0)

您的应用程序是部署为Web应用程序还是网站?如果您在虚拟目录中运行,我相信您需要在RemoveOutputCacheItem()的调用中包含虚拟目录的路径。

话虽如此,您是否考虑过使用SQL Server查询通知(Service Broker)来代替? ASP.NET使它变得非常简单。例如,请参阅SqlDependencySqlCacheDependencyResponse.AddCacheItemDependency()