MvcSiteMapProvider没有准备好页面渲染,缓存问题?

时间:2012-10-05 16:29:04

标签: asp.net-mvc caching mvcsitemapprovider asp.net-mvc-sitemap

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

MvcSiteMapProvider经常被ASP.NET SiteMapProvider的线程模型所咬,特别是在拥有更大的站点地图定义时。目前没有针对此行为的解决方法,但我正在计划重写(并放弃ASP.NET SiteMapProvider依赖项)以使其在恶劣条件下更稳定。

答案 1 :(得分:1)

MvcSiteMapProvider v4已经发布,并且是available on NuGet

它使用自己的more configurablemore extensible缓存机制,而不是之前的缓存机制。到目前为止,在第4版中没有关于菜单消失或其他奇怪的首次请求问题的报告。