tl;dr: 来自 MvcSiteMapProvider 的菜单有时无法在应用程序重新联机后呈现自身,即使代码运行并且菜单在页面刷新后呈现。
我在 ASP.NET MVC 3 项目中使用 MvcSiteMapProvider,偶尔在将应用程序从离线切换到在线后(通过将App_Offline.htm
文件插入服务器的根目录并删除它),在页面刷新之前,菜单不会呈现任何内容。
我正在使用自定义 DynamicNodeProvider 从数据库中查询菜单项,然后呈现菜单。在调试时,我可以看到这段代码确实在页面加载之前运行,但页面上没有呈现菜单。我将缓存设置为几个小时,并且正在使用自定义缓存键以允许在某些操作后失效。
不幸的是,我无法始终如一地重现此错误。但是,如果我在 DynamicNodeProvider 的顶部添加一个睡眠,我可以让它更频繁地重现——它会在 60-70% 的时间里失败,睡眠时间超过 30 秒。到目前为止,我最好的猜测是它与缓存机制有关,因为将我的缓存持续时间设置为 0似乎可以使它没有问题,并且菜单总是弹出。但是,很难确定,因为问题很难确定。由于性能拖累,将其保留为 0 将不是一个可接受的解决方案。
这个问题的根本原因可能是什么?有没有人见过这种行为或有解决方法?