首页 > 解决方案 > Kentico 12 在不同环境中的缓存

问题描述

带有 Kentico 12 后端的 MVC C# 项目(没有拖放 Web 部件,仅将其用作后端 CMS,并调用 Kentico API 获取数据)。基本上,我们遇到了仅在我们的一个环境 (PROD) 上发生的缓存问题。我相信这更多的是 IIS 或环境问题,而不是 Kentico 问题。让我给你一些细节:Kentico 12 MVC v12.0.34(从 K11 升级),如前所述,我们不使用任何 Web 部件/组件。Kentico 只是后端 CMS,我们使用 Kentico API 为每个页面提取数据并滚动我们自己的视图和模型。

我们有 2 个环境,STG 和 PROD,它们都运行 Win Server 2016,它们的操作系统构建版本 STG 略有不同:v1607 操作系统构建 14393.3115,IIS v10.0.14393.0 PROD:v1607 操作系统构建 14393.2999,IIS v10.0.14393.0

在 Kentico 中,当我们更新类别时,会为 UPDATE 连接一个事件并运行以下代码:

CacheHelper.TouchKeys(new[] { "cms.category|all" });

这会清除所有类别缓存(Kentico 中的 CacheDependency),当刷新网页时,您猜对了,所有类别都会被再次调用。如果您再次尝试,您将获得一个缓存版本,直到类别中发生更改(或者缓存时间用完,例如一个月)。完全按照您在 STG 盒子上的想法工作。

只是为了看看发生了什么,我添加了一些 Kentico 信息日志记录,以检查在此更新事件触发的不同位置发生了什么。从 EventArgs 我可以得到事件的来源(哪个类别触发了它),我可以看到它何时使用缓存信息以及何时从数据库中检索它。惊人的。

我遇到的问题是,当我使用完全相同的代码库以及相同的日志记录在 PROD 上运行并触发相同的事件时,缓存不会被释放。事件日志说它有,但是当网页刷新时,GetAllCategories 不是全新的,而是最后一个缓存的值。获取新版本的唯一方法是回收应用程序池或在 IIS 中关闭/启动应用程序。

类/方法上没有输出缓存。跨 2 个不同服务器的相同代码库。是否有一些环境变量或 IIS 设置可以在 PROD 框上进行不同的设置?

有什么想法可能导致这种情况吗?其他地方可以在网络服务器上查看?谢谢你的帮助!

标签: cachingkentico-12cache-dependencykentico-api

解决方案


我遇到了与此类似的缓存问题,结果证明是 Web Farm 配置造成的。

问题是当您将 CMS 和 MVC 都托管在同一台服务器上时,Kentico 无法在 Web Farms 中区分它们。

确保您的 CMSApp 和 MVC 项目每个都有 web.config 键来设置 CMSInstanceNameSuffix 键。这将有助于在 Web Farms 中区分它们,并允许为您的 MVC 应用程序正确生成 Web Farm 任务。


推荐阅读