我们正在优化网站,并且已经阅读了很长时间内初始视图查找的问题。然后,对视图的后续查找要快得多。 Mini-profiler显示很多时候都处于初始查找视图中(我知道我可以使用~path来减少这种情况)以及此阶段所做的其他事情。
缓存在哪里完成?视图查找等缓存了多长时间?我能看到缓存的内容吗?我们可以采取任何措施使其预先加载,以免出现延迟吗?
我们有很多观点经常没有被访问过几个小时,我不希望突然出现高峰和低谷。
我们正在使用Azure并拥有许多Web角色实例。我可以假设每个Web角色都有自己的视图查找缓存吗?我们可以集中缓存,以便每个应用程序只发生一次吗?
另外我读MVC4在查找视图方面更快?有没有人有任何数据?
答案 0 :(得分:5)
默认缓存为15分钟,存储在HttpContext.Cache中,这全部由 System.Web.Mvc.DefaultViewLocationCache 类管理。由于这使用标准的ASP.NET缓存,您可以使用自定义缓存提供程序从WAZ AppFabric Cache获取其缓存或新的缓存预览(NuGet上有一个:http://nuget.org/packages/Glav.CacheAdapter)。使用共享缓存将确保只有1个实例需要执行解析视图的工作。或者您可以构建自己的缓存提供程序。
在发布模式下运行应用程序,清除不需要的视图引擎,编写确切的路径,而不是简单地调用View,...,这些都是加快视图查找过程的方法。在这里阅读更多相关信息:
您可以通过将每个视图的键添加到缓存来预加载视图位置。您应该按如下格式进行格式化(其中此是当前的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相同。
答案 1 :(得分: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 Performance Issues with Render Partial也很有趣。
将考虑编写自己的ViewLocationCache以利用共享Azure缓存。