如何禁用 .NET WebBrowser 控件中的缓存?
Posted
技术标签:
【中文标题】如何禁用 .NET WebBrowser 控件中的缓存?【英文标题】:How to disable caching in the .NET WebBrowser Control? 【发布时间】:2011-03-26 04:04:02 【问题描述】:我已经在谷歌上搜索了几个小时并试图弄清楚这一点,但我就是做不到。 我在表单上有 1 个 webbrowser 控件,webbrowser1。
一旦我加载了一个页面,比如说google.com,如果我使用webbrowser1.refresh()
或webbrowser1.navigate("google.com")
,它不会重新加载页面,它已经缓存了它,所以它只是重新加载缓存。这在论坛或 craigslist 等页面上尤为明显。
我需要在每次刷新之间清除缓存(不理想)或一起禁用缓存,有什么想法吗?我发现的唯一东西是过时的(vb6 或更低)。
【问题讨论】:
vb6 网络浏览器控件示例仍然有效,请检查我的答案,因为如果您终止历史记录,它会欺骗浏览器认为它没有缓存副本。但唯一可靠的方法是使用其他 API 删除缓存。 【参考方案1】:在您的页面中添加以下元标记
<meta http-equiv="cache-control" content="no-cache">
【讨论】:
【参考方案2】:您可以尝试拨打webbrowser1.Refresh(WebBrowserRefreshOption.Completely)
。它应该刷新页面并显示最新版本,例如 IE 中的 ctrl+F5。请参阅here 和here 了解更多信息。
【讨论】:
【参考方案3】:使用navigate(url,4) 0x4=noCache
标志
【讨论】:
【参考方案4】:This page shows如何清除一些临时文件,阅读它。我也有这个问题,但是当 .refresh() 对我没有用时,因为它不会触发 documentcomplete 事件。因此,当我想重新加载时,我只需使用 .navigate()
并在导航之前调用
System.Diagnostics.Process.Start("rundll32.exe","InetCpl.cpl,ClearMyTracksByProcess 8")
为了清除缓存。
【讨论】:
【参考方案5】:在 .navigate 方法中,您传递了数字 2(无历史标志),但这只会杀死该导航的历史,不会杀死您点击链接的历史。如果您想杀死被点击的链接的历史记录,那么您可以在 beforenavigate 事件期间拦截导航,通过设置 cancel = true 取消导航,然后使用事件提供的 URL,使用带有标志的 .navigate 重新进行导航再次设置为 2(无历史标志)。
至于 cookie 等其他缓存项,这些标志不起作用(尽管他们可能在当前版本中实现了这一点)......所以要杀死所有你实际上需要在 Web 浏览器控制之外以编程方式执行此操作的缓存项通过使用其他 API 查询用户缓存并将其删除,可能在文档完成事件期间或浏览完成时。
还要注意,如果您使用 Web 浏览器控件终止历史记录,则 Web 浏览器控件的 .goback 方法将不起作用(因为不幸的是它使用相同的历史记录,并且不会在内存中保留另一个历史记录列表)...所以在进行回退时,它会表现得好像没有什么可以回溯到 :/.
如果您需要更多帮助,请告诉我。
【讨论】:
【参考方案6】:C# WebBrowser control: Clearing cache without clearing cookies
【讨论】:
【参考方案7】:您可以尝试在 url 中添加一个随机数或 guid 作为参数。如:
var url = "http://google.com";
webBrowser.Navigate(url + "?refreshToken=" + Guid.NewGuid().ToString());
它并不优雅,但它确实有效。希望对您有所帮助。
【讨论】:
【参考方案8】:您无法禁用它。您可以刷新页面,在每次请求之前清除缓存,或者使用 Web 浏览器控件以外的其他东西。如果要在每次请求之前清除缓存,网上有很多不良信息。我会在这里向您推荐我的答案:https://***.com/a/22074463/1607218。请注意,该页面上其他答案中发布的代码不可靠,并且存在大量错误,但希望我的回答能引导您朝着正确的方向前进:)
【讨论】:
以上是关于如何禁用 .NET WebBrowser 控件中的缓存?的主要内容,如果未能解决你的问题,请参考以下文章