12 asp.net asp.net-mvc asp.net-mvc-5
我正在使用这样的代码:
bundles.Add(new ScriptBundle("~/bundles/textview")
                    .Include(
                        "~/Scripts/printarea/jquery.PrintArea.js",
                        "~/Scripts/pagedown/Markdown.Converter.js",
                        "~/Scripts/pagedown/Markdown.Sanitizer.js",
                        "~/Scripts/pagedown/Markdown.Editor.js"
                    ));
这会创建一个缓存过期日期提前一年的文件,这是我在查看源代码时出现在我的脚本HTML中的内容:
<script src="/bundles/textview?v=cNvP0r6Jo6hsl2Sdzhw-o3kAK7t2JdcNWiG0iIg7Lys1"></script>
那么为什么我在fiddler仍然会看到它去服务器检查文件是否被修改过?是否有一种方法可以修改bundle例程,以便它不添加?v =而只是简单地将GUID附加到文件名,例如中间的连字符?
查询字符串v具有值标记,该标记是用于高速缓存的唯一标识符.只要捆绑包没有更改,ASP.NET应用程序就会使用此令牌请求捆绑包.如果包中的任何文件发生更改,ASP.NET优化框架将生成一个新令牌,保证对该包的浏览器请求将获得最新的包.
为什么服务器检查?
浏览器使用新鲜度启发式来确定它们是否应该使用服务器验证资源,或者只是从缓存中提取资源.
除非满足下列条件之一,否则浏览器将提供缓存文件而不用服务器验证它们:
将Web.config文件添加到Scripts文件夹:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <staticContent>
             <clientCache cacheControlMode="UseExpires" 
                          httpExpires="Thu, 01 Jan 2016 00:00:00 GMT" />
        </staticContent>
    </system.webServer>
</configuration>
这会将Expires Header设置为一年.这将允许您直接从缓存中提供文件,而无需在下一年检查服务器.
对于bundle,标题是在内部显式设置的System.Web.Optimization.dll:
private static void SetHeaders(BundleResponse bundle, BundleContext context)
{
    if (context.HttpContext.Response != null)
    {
        if (bundle.ContentType != null)
        {
            context.HttpContext.Response.ContentType = bundle.ContentType;
        }
        if (!context.EnableInstrumentation && context.HttpContext.Response.Cache != null)
        {
            HttpCachePolicyBase cache = context.HttpContext.Response.Cache;
            cache.SetCacheability(bundle.Cacheability);
            cache.SetOmitVaryStar(true);
            cache.SetExpires(DateTime.Now.AddYears(1));
            cache.SetValidUntilExpires(true);
            cache.SetLastModified(DateTime.Now);
            cache.VaryByHeaders["User-Agent"] = true;
        }
    }
}
因此,您需要检查是否违反了强制浏览器检查服务器的任何规则!
引用:
如果您的目标是将脚本始终发送为:
<script src="/Scripts/printarea/jquery.PrintArea.js"></script>
<script src="/Scripts/pagedown/Markdown.Converter.js"></script>
<script src="/Scripts/pagedown/Markdown.Sanitizer.js"></script>
<script src="/Scripts/pagedown/Markdown.Editor.js></script>
而不是:
<script src="/bundles/textview?v=cNvP0r6Jo6hsl2Sdzhw-o3kAK7t2JdcNWiG0iIg7Lys1"></script>
然后将以下内容添加到RegisterBundles方法中(禁用Bundling和Minification):
BundleTable.EnableOptimizations = false;
除非
EnableOptimizations是true或者Web.config文件中的编译元素中的debug属性设置为false,否则不会捆绑或缩小文件.此外,将不使用.min版本的文件,将选择完整的调试版本.EnableOptimizations覆盖 Web.config文件中编译元素中的debug属性
| 归档时间: | 
 | 
| 查看次数: | 752 次 | 
| 最近记录: |