为什么我的客户端去服务器来检查在使用ASP.NET MVC包时是否修改
我使用的代码如下:
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> 那么为什么我在提琴手中仍然看到它去服务器来检查文件是否被修改?有没有一种方法可以修改bundle例程,以便它不添加?v =,而是简单地将GUID附加到文件名中,例如两者之间的连字符? 解决方法
查询字符串v具有值令牌,它是用于缓存的唯一标识符.只要捆绑包不变,ASP.NET应用程序将使用此令牌请求捆绑包.如果包中的任何文件发生更改,ASP.NET优化框架将生成一个新的令牌,保证浏览器对该包的请求将获得最新的捆绑.
为什么服务器检查? 浏览器使用新鲜启发式来确定它们是否应该使用服务器验证资源,或者只是从缓存中提取资源. 浏览器将提供缓存的文件,而不用服务器进行验证,除非有以下情况之一: >没有满足新鲜启发式(即缓存中的文件不被认为是新鲜的). 将一个Web.config文件添加到脚本文件夹中: <?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; } } } 所以你需要检查你没有违反任何规则强制浏览器检查与服务器! 引用: > Bundling and Minification 更新 如果您的目标是让您的脚本始终如下: <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方法中(禁用捆绑和分类): BundleTable.EnableOptimizations = false;
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 为什么调试器不会在我的ASP.NET应用程序的断点处停止?
- asp.net-mvc – 使用linq2sql在c#mvc中不显示所选项的多选列
- asp.net – 是否可以解密和查看ViewState值?
- asp.net-mvc – Ninject – 具有参数/ Entity Framework连接
- asp.net-mvc – 重定向到mvc中的actionresult但不想通过返回
- asp.net – 在VS2008发布网站后,全球资源无法解决
- 在VS环境下使用SVN
- ASP.Net MVC 3奇怪的会话行为
- 使用webforms的ASP.NET中的静态和动态控件之间有什么区别
- asp.net-mvc – MVC 3 Ajax.ActionLink不能正常工作
- asp.net-mvc – 我可以在使用区域时将system.web
- asp.net – 在Visual Studio 2015社区中看不到“
- asp.net-mvc – 从Scripts.Render中排除的Asp.Ne
- 在asp.net中的web.config的位置元素中有多个路径
- asp.net-mvc – ‘System.Web.Webpages.Html.Htm
- asp.net-mvc – ASP.NET WEB API将DateTime作为U
- asp.net – AppendHeader是否与AddHeader完全相同
- asp.net-mvc – 如何使用wmd-editor控件检索mark
- asp.net-mvc – 为什么实体框架在更新父项时会插
- asp.net – 在未经授权的请求后禁止NTLM对话框