我有一个缓存带有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不可用) 我在文件上添加依赖项,然后当我想清除缓存时,我只是对内容进行处理。 可以吗?
答案 0 :(得分:2)
您的共享主机是单个服务器还是服务器群(如AZURE)? 缓存是服务器级别,因此在多实例上下文中,清除缓存不会影响其他服务器上的缓存。
EDIT
在多服务器环境中,您可以:
- 使用共享缓存(AZURE提供它,但它需要花钱)
- 创建一个管理缓存的系统(即使用数据库表存储每个对象的最后更新时间,以便任何服务器在查看缓存结之前必须重置)
- 避免使用缓存
答案 1 :(得分:0)
您的应用程序是部署为Web应用程序还是网站?如果您在虚拟目录中运行,我相信您需要在RemoveOutputCacheItem()
的调用中包含虚拟目录的路径。
话虽如此,您是否考虑过使用SQL Server查询通知(Service Broker)来代替? ASP.NET使它变得非常简单。例如,请参阅SqlDependency
,SqlCacheDependency
和Response.AddCacheItemDependency()
。