3

我们正在优化一个站点,并且已经阅读了关于初始视图查找需要很长时间的问题。随后对视图的查找会快得多。Mini-profiler 显示很多时间都在初始查找视图中(我知道我可以使用 ~ 路径来减少这种情况)以及在此阶段完成的任何其他操作。

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

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

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

我还读到 MVC4 查找视图更快?有人有数据吗?

4

2 回答 2

5

默认缓存为 15 分钟,存储在 HttpContext.Cache 中,这全部由System.Web.Mvc.DefaultViewLocationCache类管理。由于这使用标准 ASP.NET 缓存,您可以使用自定义缓存提供程序,从 WAZ AppFabric 缓存或新的缓存预览中获取缓存(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 相同。

于 2012-08-02T22:53:33.380 回答
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 缓存。

于 2012-08-03T08:37:22.450 回答