MVC视图查找缓存。它被缓存多长时间?它在哪里被缓存?

3
我们正在优化一个网站,并了解到初始视图查找需要很长时间的问题。随后对视图的查找就快得多了。Mini-profiler显示,大部分时间都在初始查找视图(我知道可以使用~路径来减少这个时间),以及此阶段所做的其他任何事情。
缓存是在哪里进行的?视图查找等缓存保留多长时间?我能看到什么已被缓存?我们能否采取任何措施使其预加载,以免出现延迟?
我们有许多视图通常几小时不会被访问,我不希望性能突然波动。
我们正在使用Azure,并拥有多个Web角色实例。我可以假设每个Web角色都有自己的视图查找缓存吗?我们能否集中缓存,使其每个应用程序只发生一次?
另外,我读到MVC4在查找视图方面更快?有人有数字吗?
2个回答

5
默认缓存时间为15分钟,存储在HttpContext.Cache中,这一切都由System.Web.Mvc.DefaultViewLocationCache类管理。由于它使用标准的ASP.NET缓存,您可以使用自定义缓存提供程序,该提供程序从WAZ AppFabric Cache或新的缓存预览(NuGet上有一个:http://nuget.org/packages/Glav.CacheAdapter)获取其缓存。使用共享缓存将确保只有一个实例需要解析视图的工作。或者您可以构建自己的缓存提供程序。
在发布模式下运行应用程序,清除不需要的视图引擎,编写精确路径而不是简单地调用View等方法都可以加快视图查找过程。在此处阅读更多信息: 你可以通过向缓存中添加每个视图的键来预加载视图位置。应按以下格式进行格式化(其中 this 是当前的VirtualPathProviderViewEngine):
string.Format((IFormatProvider) CultureInfo.InvariantCulture, ":ViewCacheEntry:{0}:{1}:{2}:{3}:{4}:", (object) this.GetType().AssemblyQualifiedName, (object) prefix, (object) name, (object) controllerName, (object) areaName);

我没有任何数据证明MVC4更快,但是看起来DefaultViewLocationCache代码与MVC3相同。

谢谢,太好了。我会考虑使用更长时间的缓存以及在新的共享Azure缓存中进行缓存。 - GraemeMiller

3

为了将我的缓存时间增加到24小时,我在Global.asax文件中使用了以下内容:

    var viewEngine = new RazorViewEngine
                         {ViewLocationCache = new DefaultViewLocationCache(TimeSpan.FromHours(24))};
    //Only allow Razor view to improve for performance
    ViewEngines.Engines.Clear();
    ViewEngines.Engines.Add(viewEngine);

此外,这篇文章ASP.NET MVC使用Render Partial存在性能问题也很有趣。

我会考虑编写自己的ViewLocationCache以利用共享的Azure缓存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接