IIS站点恢复.cshtml布局页后仍报找不到路径500错误
根因说明
该问题并非IIS层缓存或配置导致,本质是ASP.NET MVC Razor视图引擎的视图查找缓存,与文件变更通知(FCN)机制存在竞态缺陷:
- 当
/Views/下的布局页被删除、重命名时,Razor引擎处理请求时会立刻触发视图路径查找,查找失败的结果会被写入内存中的视图路径缓存,该缓存为滑动过期策略,有效期内不会重新扫描磁盘文件。 - 你当前配置的
fcnMode="Single"为全局单对象监听文件变更模式,理论上文件恢复时FCN会触发缓存清空,但该模式下存在已知逻辑问题:如果站点持续收到请求,每次请求命中"找不到视图"的错误时,都会自动续期失败结果的缓存条目,导致FCN的缓存清空逻辑始终无法生效,错误状态被永久锁定。 - 静置站点可自动恢复的原因是没有新请求续期缓存,等缓存默认滑动过期周期(约15分钟)结束后,下一次请求会重新扫描磁盘,即可识别到恢复后的布局页。
解决方案
按优先级从高到低操作即可:
- 临时快速恢复:直接回收对应站点的IIS应用程序池,会清空所有进程内内存缓存,站点可立刻恢复正常,无需重启整个IIS服务。
- 永久修复(推荐):修改站点根目录
web.config,在<appSettings>节点下添加配置,关闭Razor引擎对视图查找失败结果的缓存:
该配置对Umbraco 7、原生MVC 4/5均生效,不会影响正常视图的渲染性能,仅会在视图查找失败时跳过缓存逻辑。<add key="webpages:EnableViewNotFoundCache" value="false" /> - 兼容老版本方案:如果当前MVC版本过低不支持上述配置键,可将
httpRuntime节点下的fcnMode属性从Single改为Default。默认模式下会对每个目录单独注册文件变更监听,通知响应更及时,可避免缓存续期的竞态问题。 - 开发环境方案:开发调试场景下可将
<compilation>节点的debug属性设为true,该模式下Razor不会缓存任何视图查找结果,不会触发该问题,注意生产环境禁止开启debug模式。
验证说明
配置修改后可手动删除、恢复布局页验证:无论是否持续刷新请求,文件恢复后最多1-2次请求即可正常加载页面,不会再出现持续报错的问题。
内容的提问来源于stack exchange,提问作者bowserm
相关产品推荐
相关产品推荐

