【问题标题】:IE Ajax Streaming/long-polling without folding the serverIE Ajax Streaming/long-polling 不折叠服务器
【发布时间】:2011-08-17 21:22:27
【问题描述】:

我正在尝试解决如何在不折叠服务器的情况下为 IE 进行流式处理和长轮询。这是我的想法。

我将有一个名为 TimeServlet 的 servlet。

在 doGet 或 doPost() .. 我将暂停请求并在每一秒发送时间。

.... suspend() while(!stopped){ request.writeln(new Date().toString()); }

或者使用 Scheduler 和 Runnable,但你明白了。

在客户端的 javascript 中,我将创建一个 ajax 连接。

我的大问题是:

1 - 如何使用 IE 进行流式传输?使用 Firefox 和 Chrome,我在 readyState==3 时读取数据,但在 IE 中,数据仅在 readyState==4 时可用。

2 - 在此示例中如何进行长轮询?长轮询阻塞,直到服务器有数据要推送,但在这个例子中,服务器总是有东西要推送,所以客户端会做类似 while(true) 的事情并淹没服务器。我想我必须做这样的事情

ajax.push(null) ... on readyState==4 -> read ... 之后 setTimeout(resendRequest, 1); //1 秒?

有人有这样的样本吗?

我的代码适用于 FF 和 Chrome,但现在我正在寻找 IE 和 Opera。

编辑

我发现我可以在 IE 中使用 XDomainRequest 进行流式传输。您必须在服务器代码中包含它:

response.setHeader("Access-Control-Allow-Origin","*");

我暂时不会回答这个问题,因为我不知道如何检测连接是否完成。

使用 Ajax,这很容易.. ReadyState==4。但我不知道 XDomainRequest。

我需要能够在连接关闭时触发一些 javascript 回调。有什么想法吗?

【问题讨论】:

  • 我从来没有在 IE 中做过 comet,但是这里有一个对象,可以让您在接收数据时获取数据,XDomainRequest。 onprogress 事件应在数据传输时触发并授予您访问权限。我从未尝试过,所以我无能为力了,对不起:/
  • 谢谢,但它与普通的“Msxml2.XMLHTTP”、“Microsoft.XMLHTTP”略有不同,但仅适用于 state4。 msdn.microsoft.com/en-us/library/ms535874%28v=vs.85%29.aspx
  • @Sebastien 是的,它是不同的,但它是在 IE8 或更低版本中访问的唯一方法,请参阅Here。
  • 感谢安德鲁。非常好的网站。我会尝试并在此处使用代码发布回复
  • 最后,在这一点上我无法让它工作。我收到 .onerror() 事件,而不是文本。我使用了帖子而不是获取。如果我将 URL 替换为“enhanceie.com/test/streamWithPrelude.aspx?"+Math.random()”,它将起作用。我认为问题可能出在服务器代码中。我可以在您的示例中看到它吗?

标签: ajax internet-explorer streaming comet long-polling


【解决方案1】:

我找到了如何检测关闭事件。您必须使用 onload 方法。

所以代码看起来像这样

var ajaxRequest = new XDomainRequest(); ajaxRequest.onload = function() { //alert("[XDR-onload]. responseText: " + ajaxRequest.responseText + ""); }; ajaxRequest.onerror = function() { alert("[XDR-onerror] Fatal Error."); }; ajaxRequest.ontimeout = function() { alert("[XDR-ontimeout] Timeout Error."); }; ajaxRequest.onprogress = function() { //alert("[XDR-onprogress] responseText so far: " + ajaxRequest.responseText + ""); };

并且不要忘记在响应中添加标头(服务器端)

response.setHeader("Access-Control-Allow-Origin","*");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多