【问题标题】:Does ASP.NET store bundled scripts in memory?ASP.NET 是否将捆绑的脚本存储在内存中?
【发布时间】:2017-05-21 19:24:42
【问题描述】:

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

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

【问题讨论】:

  • 你可以试试technet.microsoft.com/en-us/sysinternals/bb896645 看看css文件何时/是否被命中。
  • 谢谢,我忘了procmon。看起来答案是肯定的,尽管我在观看一个特定 .js 文件的 procmon 时看到了我不太理解的行为。启用捆绑后,我不清楚 .NET 是如何知道对文件所做的更改(更新版本哈希),因为我没有注意到在修改后文件的完整读取,尽管脚本确实在客户端表现不同。下一步我想我正在研究 ILSpy 的代码只是因为我很好奇,但我确实得到了我正在寻找的原始答案,谢谢

标签: asp.net bundling-and-minification asp.net-bundling


【解决方案1】:

简答

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

长答案

首先,bundle 将被浏览器缓存,正如Bundling and Minification 页面中所说的那样:

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

捆绑和缩小主要改善首页请求加载时间。 请求网页后,浏览器会缓存资产(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 分钟之后也是如此:

  • 边缘:
  • Firefox 开发版:

【讨论】:

  • 感谢您的彻底测试,procmon 能够确认服务器缓存了捆绑的脚本内存。我试图衡量复制脚本(不同包中的相同脚本)对大型应用程序的影响,并且看起来这些脚本确实挂在应用程序池内存中,直到它被回收并重新创建包
猜你喜欢
  • 2018-05-06
  • 2017-01-08
  • 1970-01-01
  • 1970-01-01
  • 2016-04-16
  • 1970-01-01
  • 2017-11-20
  • 1970-01-01
  • 2016-12-24
相关资源
最近更新 更多