0

我最近更新了一个使用 Dojo 向我的服务器发送异步请求的应用程序,该服务器使用 cgi 为这些请求提供服务。

我的问题如下。因此,例如发出请求的变量是

parent.sc_dojo.io.script.jsonp_sc_dojoIoScript2

这个新服务发送响应的时间过长,大约需要 40 - 60 秒,在此之后,变量 parent.sc_dojo.io.script.jsonp_sc_dojoIoScript2 显示为 UNDEFINED

我使用firebug进行了分析,主要细节见下图。

对我服务器的请求在 40 到 50 秒内得到响应

对服务器的请求具有以下数据:

Connection  Keep-Alive
Content-Type    text/javascript; charset=utf-8
Date    Tue, 10 Sep 2013 12:39:22 GMT
Keep-Alive  timeout=5, max=100
Server  Apache/2.2.22 (Ubuntu)
Transfer-Encoding   chunked

超时范围从 5 到 100,我真的不知道这个度量的单位,有什么想法吗?

4

1 回答 1

1

关于 Connection Keep-Alive
当客户端浏览器向 HTTP/1.1 服务器发送“Connection: Keep-alive”标头时,浏览器正在说“嘿,我要进行长时间的对话,所以不要关闭连接之后第一次交换。”

保持活动“超时”值以秒为单位。“max”值是无单位的,表示每个连接的最大服务请求数。总而言之,这些将客户端的请求增加到“嘿,我想进行长时间的对话,所以不要在第一次交换后关闭连接但是如果在 5 秒内没有任何交换(超时)或者如果超过 100 个请求返回来回(最大),我同意你关闭连接。” 服务器使用它将为超时和最大值服务的实际值进行响应。

关闭连接的惩罚是必须打开一个新连接。一些现代浏览器限制同时打开的连接数,因此将这些值保持得太小可能会引入延迟(当您的应用程序等待免费连接时)。另一方面,服务器不需要同意请求的超时和最大值:服务器设置自己的限制。

有关详细信息,请参阅这些文章:

关于 dojo 超时我看不到您的代码或 dojo 版本,但 dojo 允许您通过XHR request 中的 timeout 属性
设置等待响应的时间。默认超时为“从不”。代码如下。

实际上,“从不”具有误导性:浏览器有自己的默认保持活动超时,上游路由器可能有自己的超时

尽量保持简短。如果响应时间超过 15 秒,则可能需要采用不同的设计方法来解决问题:反向 ajax、轮询、组合响应等。

require(['dojo/request/xhr'], function (xhr) {
  xhr(
    'http://www.example.com/echo',
    { timeout:15000 /* change this, units are milliseconds */, handleAs:'json' }
  ).then(function (r) {
    console.log(r);
  });
});

具体问题
好了,终于。如果您的服务器端运行时间较长,我会这样做:

  1. 从客户端向启动作业的服务器发送请求
  2. 服务器以可以轮询状态的唯一 URL 响应
  3. 在 Javascript 中,使用 setInterval() 定期检查返回的 URL 的状态
  4. 当 URL 显示“状态”完成时,终止 setInterval 并发出最终调用以获取结果
于 2013-12-17T16:18:26.560 回答