我遇到了一个长同步请求将冻结 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 加载,并且所有异步的服务器端计算都是一项巨大的工作,已经为我们的客户引用并且是一个长期目标。我现在需要一个短期修复)