我有一个 ASP.NET 应用程序,它通过使用带有刷新标头(或页面中的元刷新标记)的隐藏 IFRAME 来实现保持活动。
对于 Internet Explorer 的许多(但不是全部)实例(迄今为止在 IE7 和 IE8 beta 上重现 - 但不是针对所有人!)如果您在两个都包含此保持活动 IFRAME 的安全页面之间移动,您会得到类似这样的序列事件:
0s:加载 page1.html - 包括 keepalive.html,安排在 15s 刷新 5s:点击page2链接 加载 page2.html - 包括 keepalive.html,安排在 20 秒刷新 15s:page1 帧刷新;显示混合内容错误框
此时浏览器中显示错误“此页面包含安全和非安全内容”。
page1.html:
<html><head><title>Page 1</title></head><body>
<h1>This is Page 1</h1>
<p><a href="page2.html">Go to Page 2</a></p>
<iframe src="keepalive.html" width="500" height="200" />
</body></html>
第 2 页是相同的,但显示为第 2 页,并链接到第 1 页,而不是。
保活.html:
<html><head>
<meta http-equiv="refresh" content="15" />
</head><body>
<h2>This is the keep alive</h2>
</body></html>
在我测试过的所有浏览器中,我确保互联网区域有权进行元刷新,并设置为在显示混合内容时提示。我已经阅读了所有建议您需要在 IFRAME 上使用 src="" 标记的页面,否则 IE 会认为它不安全 - 按照设计,它必须具有 src 标记,即保持活动页面的标记。
如果您永远坐在第 1 页上,则 IFRAME 会很好地刷新。该错误仅在您更改到第 2 页后第一次出现。
我正在寻找一种方法以最小的变化来解决这个问题:保持活动的更好方法是使用控件和自动刷新图像,我将在未来的版本中进行研究。我想到的一个可能的解决方法是让 IFRAME 的内容成为服务器的常规 XMLHttpRequest,而不是元刷新。更简单的错误修复会更好。
更新:我已将 Grant Wagner 的答案标记为正确,因为它导致我遇到实际问题:Lenovo Password Manager 插件 CpwmIEBrowserHelper 导致此错误。这巧妙地解释了为什么有些人会看到这个问题而不是其他人 - 我问过的大多数人都有 ThinkPad。禁用扩展程序会使刷新问题消失。
由于我们无法让可能使用该应用程序的每个人都解决此问题,因此我们将使用 javascript 计时器并刷新窗口位置,将 keepalive.html 页面更新为如下所示:
<html><head>
<meta http-equiv="pragma" content="no-cache">
</head><body>
<h2>This is the keep alive</h2>
<script type="text/javascript">
setTimeout ('ReloadPage()', 15000 );
function ReloadPage() {
window.location = window.location;
}
</script>
</body></html>