4

当我使用 Microsoft Web 优化(ASP.NET 和 MVC 的捆绑和缩小)创建脚本包时,服务器是否在内存中保留了包的副本?还是每次收到创建捆绑包的请求时都从磁盘读取?阅读有关该主题的许多博客和文章,但它们只谈论用法、好处等。

我什至用 WinDbg 探索了 w3wp.exe 进程,但我不够聪明或不够耐心,无法在内存中找到捆绑包来验证这一点。而且仅仅看任务管理器似乎并不可靠,因为很明显字符串在某些时候会被加载到内存中,但.NET 堆并不总是立即缩小。谢谢!

4

1 回答 1

3

简短的回答

记忆。但也要记住,浏览器已经在客户端缓存了信息。

长答案

首先,捆绑包将被浏览器缓存,如捆绑和缩小页面中所述:

更新捆绑包中的一个文件后,将为捆绑查询字符串参数生成一个新令牌,并且必须在下次客户端请求包含该捆绑包的页面时下载完整捆绑包。在每个资产单独列出的传统标记中,只会下载更改的文件。频繁更改的资产可能不适合捆绑。

捆绑和缩小主要改善了首页请求加载时间。请求网页后,浏览器会缓存资产(JavaScript、CSS 和图像),因此在请求同一页面或同一站点上的页面请求相同资产时,捆绑和缩小不会提供任何性能提升。如果您没有在资产上正确设置 expires 标头,并且您没有使用捆绑和缩小,浏览器新鲜度启发式将在几天后将资产标记为陈旧,并且浏览器将要求对每个资产进行验证请求

并且也显示在这里,在同一页面拍摄的图像中,他们使用 Fiddler 进行了测试: 提琴手

到目前为止,我们是安全的,因为它已被浏览器缓存。

但是,我更进一步,在 Controller 中使用以下代码创建了一个小型测试项目:

public ActionResult Index()
{
    return View(HttpRuntime.Cache);
}

而视图中的这段代码:

<p>
    @Html.DisplayForModel()
</p>

这给了我以下结果:

  1. 第一次运行:

    :ViewCacheEntry:System.Web.Mvc.RazorViewEngine, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35:View:Index:Home:::__AppStartPage__~/_appstart.cshtml
    :ViewCacheEntry:System.Web.Mvc.RazorViewEngine, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35:View:Index:Home::Mobile:__AppStartPage__~/_appstart.vbhtml
    
  2. 第二次运行:

    :ViewCacheEntry:System.Web.Mvc.RazorViewEngine, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35:Partial:_LoginPartial:Home::Mobile:
    :ViewCacheEntry:System.Web.Mvc.RazorViewEngine, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35:View:Index:Home:::System.Web.Optimization.Bundle:~/bundles/modernizr
    :ViewCacheEntry:System.Web.Mvc.RazorViewEngine, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35:Partial:_LoginPartial:Home:::System.Web.Optimization.Bundle:~/bundles/bootstrap__AppStartPage__~/_appstart.cshtml
    :ViewCacheEntry:System.Web.Mvc.RazorViewEngine, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35:View:Index:Home::Mobile:System.Web.Optimization.Bundle:~/bundles/jquerySystem.Web.Optimization.Bundle:~/Content/css__AppStartPage__~/_appstart.vbhtml
    

在第二次运行时,您会看到modernizr、bootstrap、jquery 和css(我的包!)在缓存中。这可以解释为什么如果我们在 2 个不同的浏览器中加载相同的页面,我们将得到相同的查询字符串,即使在加载 5 分钟之后也是如此:

  • 边缘:边缘
  • 火狐开发版:火狐开发版
于 2017-01-07T13:44:46.660 回答