ASP.NET 是否将捆绑的脚本存储在内存中?
Does ASP.NET store bundled scripts in memory?
当我使用 Microsoft Web 优化(ASP.NET 和 MVC 的捆绑和缩小)创建脚本包时,服务器是否在内存中保留该包的副本?或者它是否在每次收到创建捆绑包的请求时从磁盘读取?阅读了很多关于这个主题的博客和文章,但他们只谈论用法、好处等。
我什至用 WinDbg 查了一下 w3wp.exe 进程,但我不够聪明或不够耐心,无法在内存中找到捆绑包来验证这一点。而且只看任务管理器似乎并不可靠,因为显然字符串在某个时候会被加载到内存中,但 .NET 堆并不总是立即收缩。谢谢!
简答
内存。但也要记住,浏览器已经在客户端缓存了这些信息。
长答案
首先,如 Bundling and Minification 页面中所述,浏览器将缓存该包:
Once you update one file in a bundle, a new token is generated for the
bundle query string parameter and the full bundle must be downloaded
the next time a client requests a page containing the bundle. In
traditional markup where each asset is listed individually, only the
changed file would be downloaded. Assets that change frequently may
not be good candidates for bundling.
Bundling and minification primarily improve the first page request load time.
Once a webpage has been requested, the browser caches the assets (JavaScript,
CSS and images) so bundling and minification won’t provide any performance
boost when requesting the same page, or pages on the same site
requesting the same assets. If you don’t set the expires header
correctly on your assets, and you don’t use bundling and minification,
the browsers freshness heuristics will mark the assets stale after a
few days and the browser will require a validation request for each
asset
这里也显示了从同一页面截取的图像,他们在其中使用 Fiddler 进行了测试:
到目前为止我们是安全的,因为它已被浏览器缓存。
不过,我更进一步,在控制器中使用以下代码创建了一个小测试项目:
public ActionResult Index()
{
return View(HttpRuntime.Cache);
}
视图中的这段代码:
<p>
@Html.DisplayForModel()
</p>
这给了我以下结果:
第一个运行:
: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
第二个运行:
: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 开发版:
当我使用 Microsoft Web 优化(ASP.NET 和 MVC 的捆绑和缩小)创建脚本包时,服务器是否在内存中保留该包的副本?或者它是否在每次收到创建捆绑包的请求时从磁盘读取?阅读了很多关于这个主题的博客和文章,但他们只谈论用法、好处等。
我什至用 WinDbg 查了一下 w3wp.exe 进程,但我不够聪明或不够耐心,无法在内存中找到捆绑包来验证这一点。而且只看任务管理器似乎并不可靠,因为显然字符串在某个时候会被加载到内存中,但 .NET 堆并不总是立即收缩。谢谢!
简答
内存。但也要记住,浏览器已经在客户端缓存了这些信息。
长答案
首先,如 Bundling and Minification 页面中所述,浏览器将缓存该包:
Once you update one file in a bundle, a new token is generated for the bundle query string parameter and the full bundle must be downloaded the next time a client requests a page containing the bundle. In traditional markup where each asset is listed individually, only the changed file would be downloaded. Assets that change frequently may not be good candidates for bundling.
Bundling and minification primarily improve the first page request load time. Once a webpage has been requested, the browser caches the assets (JavaScript, CSS and images) so bundling and minification won’t provide any performance boost when requesting the same page, or pages on the same site requesting the same assets. If you don’t set the expires header correctly on your assets, and you don’t use bundling and minification, the browsers freshness heuristics will mark the assets stale after a few days and the browser will require a validation request for each asset
这里也显示了从同一页面截取的图像,他们在其中使用 Fiddler 进行了测试:
到目前为止我们是安全的,因为它已被浏览器缓存。
不过,我更进一步,在控制器中使用以下代码创建了一个小测试项目:
public ActionResult Index()
{
return View(HttpRuntime.Cache);
}
视图中的这段代码:
<p>
@Html.DisplayForModel()
</p>
这给了我以下结果:
第一个运行:
: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
第二个运行:
: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 开发版: