0

我遇到了一个长同步请求将冻结 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”已被处理,则不会解冻。

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

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

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

你知道冻结可能来自哪里(IE 错误、XMLHttpRequest 错误、我做错了什么)以及如何避免这种情况?

谢谢 !

凯文 B

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

4

1 回答 1

0

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

你可以试试:

  1. 在后台线程上调用同步 XHR 请求,然后在您准备好时编组到 UI 线程(例如使用 Dispatcher.BeginInvoke)
  2. 设置一个 XMLHttpRequest 包装器,以异步模式进行调用并在完成时在 Silverlight 中引发回调
  3. 使用 HttpClient 或 WebClient

虽然这些选项是异步的,但它们不需要以任何不同的方式编写您的服务器代码(它可以保持同步)。我看到一个 Web 服务器在最终返回响应之前处理了一个多小时的调用,此时 Silverlight 应用程序引发了回调。您甚至可以使用诸如 TPL 等待/异步之类的工具,或许多 mvvm 框架中可用的协同例程,以使代码看起来非常程序化/同步,同时仍然异步执行其操作。

我希望你已经解决了你的问题,但也许这对任何可能遇到这篇文章的人都有帮助。

于 2014-02-13T19:13:46.967 回答