MVC视图查找缓存.它缓存了多长时间?以及它缓存在哪里



我们正在优化一个网站,并了解到初始视图查找需要很长时间的问题。随后对视图的查找要快得多。Mini-profiler显示,很多时间都在初始查找视图中(我知道我可以使用~path来减少这种情况),以及在这个阶段所做的其他操作。

缓存在哪里完成?视图查找等缓存多长时间?我能看到缓存的内容吗?我们能做些什么让它预加载,这样就不会有延迟吗?

我们有很多视图经常几个小时都没有访问,我不希望性能出现突然的高峰和低谷。

我们正在使用Azure,并且有许多web角色实例。我可以假设每个web角色都有自己的视图查找缓存吗?我们是否可以集中缓存,以便每个应用程序只发生一次缓存?

我还读过MVC4在查找视图方面更快?有人有数字吗?

默认缓存为15分钟,存储在HttpContext.cache中,这一切都由System.Web.Mvc.DefaultViewLocationCache类管理。由于这使用标准的ASP.NET缓存,您可以使用自定义缓存提供程序,该提供程序从WAZ AppFabric缓存或新的缓存预览中获取缓存(NuGet上有一个:http://nuget.org/packages/Glav.CacheAdapter)。使用共享缓存将确保只有一个实例需要完成解析视图的工作。或者,您可以去构建自己的缓存提供程序。

在发布模式下运行应用程序,清除不需要的视图引擎,编写确切的路径而不是简单地调用view。。。都是加快视图查找过程的方法。点击此处阅读更多信息:

  • http://samsaffron.com/archive/2011/08/16/Oh+view+where+are+thou+finding+views+in+ASPNET+MVC3+
  • http://blogs.msdn.com/b/marcinon/archive/2011/08/16/optimizing-mvc-view-lookup-performance.aspx

可以通过将每个视图的键添加到缓存中来预加载视图位置。您应该将其格式化如下(其中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的代码相同。

为了将缓存时间增加到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缓存。

最新更新