来自silverlight的长同步xmlhttprequest导致IE8冻结

时间:2013-10-29 16:28:07

标签: silverlight internet-explorer-8 xmlhttprequest freeze synchronous

我遇到一个长同步请求会冻结Internet Explorer的问题。 让我解释一下上下文:这是一个只支持IE8且只能使用Synchronous *的Web应用程序。 我们有一个带保存按钮的Silverlight组件。当用户按下按钮时,使用同步XMLHttpRequest将一些信息发送到服务器,然后在Silverlight组件中的客户端执行一些其他操作。 服务器端部分包括有时需要一段时间(几分钟)的计算。

简而言之,这是代码(c#silverlight部分)

ScriptObject _XMLHttpRequest;
_XMLHttpRequest.Invoke("open", "POST", url, false);
_XMLHttpRequest.Invoke("send", data);
checkResponse(XMLHttpRequest);
doOtherThings();

我知道服务器正常工作,因为我可以在详细日志中看到,从Silverlight调用的“url”的页面结束呈现。 但是,在调试模式下,我可以看到我从未到达“checkresponse”行。在调用“发送”行后,IE将永远冻结,一旦服务器日志显示已经处理了“url”,就不会解冻。

另外,我试图在“打开”和“发送”行之间添加“_XMLHttpRequest.SetParameter(”timeout“,5000)”。 IE冻结5秒钟,然后执行“checkresponse”和“dootherthings”。然后IE在处理服务器端计算时再次冻结,并且在服务器完成其工作后不会解冻。

IE超时应该是3个小时(注册表项ReceiveTimeout设置为10800000),我也摆脱了IE 2-connexions限制(MaxConnectionsPer1_0Server和MaxConnectionsPerServer设置为20)。

最后一个重要信息:服务器端部件只需几秒钟而不是几分钟就没有问题。

你知道冻结的来源(IE bug,XMLHttpRequest bug,我做错了什么)以及如何避免这种情况?

谢谢!

凯文B

*(在Google的帮助下尝试解决我的问题时,我发现了大量的“使用asynch”和“同步不好”的帖子;但我无法在我的应用中进行此更改。切换应用程序, ajax加载,所有服务器端计算异步是一项巨大的工作,已经为我们的客户引用并且是一个长期目标。我现在需要一个短期修复)

1 个答案:

答案 0 :(得分:0)

Silverlight几乎要求一切都是异步完成的。如果在UI线程上运行,任何长时间运行的同步进程都将挂起浏览器。如果您从未到达'checkResponse'代码行,则可能是在前一行上抛出了未处理的异常,并且正在吞下它。您可以检查浏览器的开发工具,看看是否有任何javascript错误。我很惊讶调用XMLHttpRequest同步工作,因为我希望它能锁定UI线程。但是,解决方案取决于您对异步的定义。

您可以尝试:

  1. 在后台线程上调用同步XHR请求,然后在准备就绪时编组到UI线程(例如使用Dispatcher.BeginInvoke)
  2. 设置XMLHttpRequest包装器,以异步模式进行调用,并在完成时在Silverlight中引发回调
  3. 使用HttpClient或WebClient
  4. 虽然这些选项是异步的,但它们不需要以不同的方式编写服务器代码(它可以保持同步)。在最终返回响应之前,我看到一个Web服务器处理了一个多小时的调用,此时Silverlight应用程序引发了一个回调。您甚至可以使用诸如TPL await / async之类的工具,或许多mvvm框架中可用的协同例程,以使代码看起来非常程序/同步,同时仍然异步执行其操作。

    我希望你已经解决了你的问题,但也许这对任何人都会有所帮助。