ASP.NET 优化框架缓存包响应HttpContext.Cache
并使用CacheDependency来监视包中的每个文件的更改。这就是为什么直接更新文件会使缓存失效并重新生成包的原因。
捆绑包文件名是捆绑包内容的哈希值,可确保在任何捆绑包文件被修改时 URL 会发生变化。捆绑包的虚拟路径用作缓存键。
库中的相关代码(注意这有点过时,但我相信逻辑仍然相同):
internal BundleResponse GetBundleResponse(BundleContext context)
{
// check to see if the bundle response is in the cache
BundleResponse bundleResponse = Bundle.CacheLookup(context);
if (bundleResponse == null || context.EnableInstrumentation)
{
// if not, generate the bundle response and cache it
bundleResponse = this.GenerateBundleResponse(context);
if (context.UseServerCache)
{
this.UpdateCache(context, bundleResponse);
}
}
return bundleResponse;
}
private void UpdateCache(BundleContext context, BundleResponse response)
{
if (context.UseServerCache)
{
// create a list of all the file paths in the bundle
List<string> list = new List<string>();
list.AddRange(
from f in response.Files
select f.FullName);
list.AddRange(context.CacheDependencyDirectories);
string cacheKey = Bundle.GetCacheKey(context.BundleVirtualPath);
// insert the response into the cache with a cache dependency that monitors
// the bundle files for changes
context.HttpContext.Cache.Insert(cacheKey, response, new CacheDependency(list.ToArray()));
context.HttpContext.Response.AddCacheItemDependency(cacheKey);
this._cacheKeys.Add(cacheKey);
}
}
最后,对于旧的捆绑 URL 工作,我想您会发现它们要么从浏览器缓存返回,要么实际上返回捆绑的最新版本,因为捆绑路径不会改变,只有版本查询字符串。