动态脚本文件仍然过期
Posted
技术标签:
【中文标题】动态脚本文件仍然过期【英文标题】:Dynamic script file remains out of date 【发布时间】:2019-11-04 11:47:22 【问题描述】:我正在尝试调试一段 MVC 代码,当我遇到断点时,我看到它在名为 VMnnn
的动态脚本文件中被命中。我已经尝试了所有方法,CTRL+F5,使用菜单清除浏览器缓存,清除 ASP.NET 临时文件,停止 IIS Express。然而,动态脚本文件仍然与实际脚本过时,实际脚本内嵌在视图的 Razor 代码中。
如何强制更新此动态脚本文件?或者,我可以找到并删除这个动态文件,如果它不只是在内存中。
【问题讨论】:
在您的浏览器中(假设是 Chrome):打开DevTools
(f12
) 并在 network
选项卡中选择禁用缓存。不过,您需要保持此窗口打开以禁用缓存。
另一种方法是在每次页面加载时向文件附加一个随机查询字符串:<script src="/path/to/js/file.js?some_random_string></script>
您是否将其作为捆绑包添加到BundleConfig.RegisterBundles
中?当有更改时,框架总是使用查询字符串参数使脚本唯一。
@VDWWD 不,脚本在 Razor 局部视图中是内联的,根本没有捆绑。
@GetOffMyLawn 我的脚本不是从文件引用中加载的,它在部分视图中是内联的,所以我不能在链接中附加任何内容。
【参考方案1】:
根据客户端的设置,有时客户端(尤其是 webviews)可以缓存页面内容,尽管页面应该是动态的,如果使用 GET 方法和相同的参数访问页面。其他人提到传递随机 GET 参数的建议也可能会阻止客户端缓存,但您不一定可以控制客户端的请求。在这种情况下,您可以尝试的一件事是在控制器的操作方法中添加以下行:
Response.AppendHeader("Cache-Control", "no-cache");
或者,你可以这样写一个属性:
public class NoCacheAttribute : FilterAttribute, IActionFilter
public void OnActionExecuted(ActionExecutedContext filterContext)
filterContext.RequestContext.HttpContext.Response.AppendHeader("Cache-Control", "no-cache");
public void OnActionExecuting(ActionExecutingContext filterContext)
并将[NoCache]
属性添加到您想要的任何控制器或操作。这将通知客户端此页面不应被缓存。客户端可能仍然会忽略此标头,这同样取决于其设置,但大多数客户端的默认行为应该使用此方法。
【讨论】:
【参考方案2】:您可以通过 javascript 使用 Math.random()
生成随机字符串并将其转换为字符串(然后您可以选择删除 toString()
生成的非单词字符)。
接下来我们动态创建一个脚本标签,并将随机字符串分配给src
属性的查询部分。
最后,我们将标签插入到您想要的身体或头部。 appendChild
、write
等
// Create a random string
let random = (Math.random() * 10000).toString(12)
// Generate the script tag
let script = document.createElement('script')
script.src = `http://example.com/js/myfile.js?$random`
// Place the script tag somewhere.
document.body.appendChild(script)
【讨论】:
我的问题刚刚消失了,但是虽然我的脚本不是从静态 href 加载的,而是动态地使用 XML 文件中的脚本列表。然而,这是我得到的唯一可靠的答案,而且我之前已经成功使用过这种技术,所以我接受了。以上是关于动态脚本文件仍然过期的主要内容,如果未能解决你的问题,请参考以下文章