5

tl;dr: 来自 MvcSiteMapProvider 的菜单有时无法在应用程序重新联机后呈现自身,即使代码运行并且菜单在页面刷新后呈现。

我在 ASP.NET MVC 3 项目中使用 MvcSiteMapProvider,偶尔在将应用程序从离线切换到在线后(通过将App_Offline.htm文件插入服务器的根目录并删除它),在页面刷新之前,菜单不会呈现任何内容。

我正在使用自定义 DynamicNodeProvider 从数据库中查询菜单项,然后呈现菜单。在调试时,我可以看到这段代码确实在页面加载之前运行,但页面上没有呈现菜单。我将缓存设置为几个小时,并且正在使用自定义缓存键以允许在某些操作后失效。

不幸的是,我无法始终如一地重现此错误。但是,如果我在 DynamicNodeProvider 的顶部添加一个睡眠,我可以让它更频繁地重现——它会在 60-70% 的时间里失败,睡眠时间超过 30 秒。到目前为止,我最好的猜测是它与缓存机制有关,因为将我的缓存持续时间设置为 0似乎可以使它没有问题,并且菜单总是弹出。但是,很难确定,因为问题很难确定。由于性能拖累,将其保留为 0 将不是一个可接受的解决方案。

这个问题的根本原因可能是什么?有没有人见过这种行为或有解决方法?

4

2 回答 2

2

MvcSiteMapProvider 不时被 ASP.NET SiteMapProvider 的线程模型咬住,尤其是在具有较大的站点地图定义时。目前没有针对这种行为的解决方法,但我计划进行重写(并放弃 ASP.NET SiteMapProvider 依赖项)以使其在恶劣条件下更加稳定。

于 2012-11-20T07:08:45.317 回答
1

MvcSiteMapProvider v4 已发布,可在 NuGet 上使用

它使用自己的缓存机制,该机制比以前更易于配置扩展。到目前为止,在 v4 中,还没有关于菜单消失或其他奇怪的仅限首次请求问题的报告。

于 2013-08-18T10:11:34.420 回答