在IE10页面刷新时,Silverlight应用程序消失

时间:2012-11-21 11:13:29

标签: silverlight internet-explorer windows-8 refresh internet-explorer-10

更新:此问题有解决方法。通过包含以下元标记之一强制IE10进入兼容模式:

<meta http-equiv="x-ua-compatible" content="IE=7" />
<meta http-equiv="x-ua-compatible" content="IE=8" />

由于各种原因,这不是一个完美的解决方案,但它至少消除了这个问题。


原始问题:
几个月前我意识到在Windows 8上的IE10中我们的Silverlight应用程序存在问题(我还没有尝试过Windows 7的IE10预览版)。当托管我们的SL应用程序的asp.net页面首次加载时,一切正常,应用程序按预期加载。如果我立即刷新页面,它也会按预期重新加载。但是:如果我通过点击它来关注Silverlight应用程序然后点击F5,它就会变成空白。这就像插件完全消失了。如果我使用Fiddler跟踪请求,我可以看到没有为xap文件发出请求。我一直希望这可以在IE10的补丁版本中修复,但到目前为止没有任何改变。当我尝试谷歌搜索时,我找不到任何关于此的信息。我不太可能成为第一个发现它的人,我很惊讶我没有找到更多的信息。重现问题:

  • 创建新的Silverlight应用程序
  • 向MainPage.xaml添加某种内容,如Button或其他
  • 在IE10中运行应用程序(在Win8上)
  • 单击Silverlight应用程序中的任意位置。这只是为了集中插件。
  • 刷新页面(F5)
  • 结果:Silverlight应用程序未加载且页面为空白。

一些观察结果:

  • 完成上述步骤后,任何数量的刷新都不会带来应用程序。
  • 完成上述步骤后,如果我将url重新输入地址栏并按Enter键,则应用程序会按预期加载。
  • 如果我在IE中启用兼容性视图,该应用程序也会按预期加载。在启用兼容性视图时,我所做的任何事情都不会重现该错误。

现在回答我的问题:

  1. 有没有其他人观察过这种行为?
  2. 如果是,您找到了解决方法吗?

6 个答案:

答案 0 :(得分:6)

我在IE 10中看到了与Silverlight应用程序相同的问题。

我已尝试添加上面建议的IE 8兼容性元标记,但这并不能始终如一地解决问题。在说每次第5次刷新尝试后,它似乎只能间歇性地工作?!

我能看到解决这个问题的唯一方法就是强制浏览器模式进入“IE 10兼容性视图”,我不认为这可以通过页面内容(元标记等)来完成吗?我必须删除IE 8兼容性元标记,以便地址栏中的“兼容性视图”按钮可用,然后要求用户单击兼容性按钮,然后记住该网站。这导致浏览器进入浏览器模式:“IE 10 Compat View”和文档模式:“IE7标准”。然后刷新行为按预期和以前一致地工作。

这对我们来说是个大问题。我们构建了Silverlight应用程序,以便浏览器刷新按钮用于刷新应用程序中的页面/内容(用户保持登录状态等)。我们必须要求用户将我们的站点设置为以兼容模式运行,以使刷新功能按预期工作,这真的很糟糕。

请注意,这仍然可以在Chrome中按预期运行。由于这个问题,我们可能需要建议我们的用户使用Chrome,这似乎很愚蠢!

<强>更新

解决方法似乎是始终使用JavaScript动态地将Silverlight对象加载到其托管页面中。

E.g。

function onLoad() {
  var silverlightControlHost = document.getElementById("silverlightControlHost");
  silverlightControlHost.innerHTML = "<object ...

更新2:

以下是我用来解决此问题的最新代码:

...
        function unloadSilverlight() {
            document.getElementById("silverlightControlHost").innerHTML = "";
        }

        function focusOnSilverlight() {
            document.getElementById("silverlightObject").focus();
        }

        function onLoad() {
            window.onbeforeunload = unloadSilverlight;
            setTimeout(focusOnSilverlight);
        }
    </script>
</head>
<body onload=" onLoad() ">
...

答案 1 :(得分:3)

我仍然遇到Chris提出的解决方案的问题。

这对我来说非常适合:

window.onbeforeunload = function () {
            var silverlightControlHost = document.getElementById("silverlightControlHost");
            silverlightControlHost.innerHTML = "";
        }

答案 2 :(得分:1)

我以一种非常简单的方式解决了这个问题。我在页面末尾写了一个javascript代码(或者在你的silverlight应用程序的对象标签之后),并将焦点设置为另一个元素,例如链接。示例:

<object id="silverlightHostControl">...bla bla bla</object> <script type="text/javascript" language="javascript"> var shc = document.getElementById("silverlightHostControl"); document.getElementById("myLink").focus(); </script>

shc var没用,我只是为了澄清。请记住:在解析silverlight应用程序对象标记后,您的javascript代码必须将焦点设置为另一个(但可聚焦的)对象,这意味着您的js代码在silverlight应用程序对象之后写入。

答案 3 :(得分:0)

在回答您的问题#1时,我们的Silverlight应用也会发生这种情况。唯一的解决方法是1)重新启动浏览器或2)切换到兼容模式。

这显然是ie10中的一个错误。

答案 4 :(得分:0)

感谢所有变通办法解决方案,但这显然是Silverlight插件的一个错误。

我们直接向Internet Explorer开发团队提出了几张门票,他们说问题来自外部问题。这不是微软的好答案。

无论如何,这次我们的开发人员通过Silverlight开发团队提出了机票,但仍在等待他们的响应。为了得到他们的良好回应,我们需要让更多的人面对这个问题。

您可以从Connect官方错误报告平台Connect网站投票此问题。

我们机票的链接是:http://connect.microsoft.com/VisualStudio/feedback/details/789004/ie10-shows-blank-page-upon-refreshing-silverlight-app

干杯

答案 5 :(得分:0)

是的,我的申请也面临同样的问题。如果我在IE 10中打开我的应用程序的帮助,那么我每次都要刷新页面以查看内容。

我有两个解决此问题的方法: 1.按ALT键一次 2.在兼容模式下打开IE