gpt4 book ai didi

javascript - 防止XmlHttpRequest递归调用服务器

转载 作者:行者123 更新时间:2023-11-30 08:08:31 24 4
gpt4 key购买 nike

我已经为这个问题搜寻了几个小时,但没有找到任何解决方案。

我目前正在基于this构建的Meteor应用程序上工作。

现在的情况是,在打开网站并将所有资产加载到浏览器中之后,浏览器会不断对服务器进行递归xhr调用。这些调用以25秒的常规间隔进行。

这可以在浏览器控制台的“网络”选项卡中看到。请参阅图像中最后一行的待处理请求。



我不知道它的起源,以及为什么即使用户空闲时也会自动调用它。

现在的问题是,如何禁用这些自动请求?我想手动调用请求,即选择菜单项时等。

任何帮助将被申请。

[更新]

针对Jan Dvorak的评论:

当我在搜索框中键入“ e”时,将显示名称以字母“ e”开头的事件列表。

该请求包含所有有效参数和有效负载,如下所示:

["{\"msg\":\"sub\",\"id\":\"8ef5e419-c422-429a-907e-38b6e669a493\",\"name\":\"event_Coll_Search_by_PromoterName\",\"params\":[\"e\"]}"]


这是有效的响应。

a["{\"msg\":\"data\",\"subs\":[\"8ef5e419-c422-429a-907e-38b6e669a493\"]}"]


此操作的代码已发布 here

但是在自动递归请求的情况下,请求不包含有效负载,并且响应只是字母“ h”,这很奇怪。是不是我该如何摆脱呢?

最佳答案

流星有一个功能叫做


  实时页面更新。
  
  只需编写您的模板。当数据库中的数据更改时,它们会自动更新。不再需要编写任何样板重绘代码。支持任何模板语言。


为了支持此功能,Meteor需要在幕后进行一些服务器-客户端通信。



传统上,HTTP是用来获取无效数据的。客户端告诉服务器它需要一些东西,并且得到了东西。服务器无法告诉客户端它需要什么。后来,变得需要将一些数据推送到客户端。出现了几种选择:

轮询:

客户端定期向服务器发出请求。服务器以新数据响应或立即说“无数据”。它易于实现且不占用太多资源。但是,它并不完全是实时的。它可以用于新闻行情,但对于聊天应用程序却不是很好。

如果增加轮询频率,则可以提高更新速率,但是资源使用量随轮询频率而不是数据传输速率而增加。 HTTP请求并不便宜。每秒来自多个客户端的一个请求确实会严重损害服务器。

挂起请求:

客户端向服务器发出请求。如果服务器有数据,它将发送它们。如果服务器没有数据,它只有在有数据时才响应。所做的更改会立即被获取,不需要时不会传输任何数据。但是,它确实有一些缺点:

如果Web代理看到服务器处于静默状态,它将最终切断连接。这意味着即使没有要发送的数据,服务器仍需要发送保持活动响应,以使代理(和Web浏览器)满意。

挂起的请求不会占用(很多)带宽,但是会占用内存。如今的服务器可以处理多个并发的TCP连接,因此与以前相比,这不再是一个问题。需要考虑的是与保留这些请求的线程相关联的内存量,尤其是当连接绑定到为它们服务的特定线程时。

浏览器对每个域的总并发请求数量有严格的限制。再说一次,现在这不再像以前那样令人担忧。因此,每个会话仅具有一个挂起请求似乎是一个好主意。

管理挂起的请求有点麻烦,因为您必须在每次响应后都提出一个新请求。 TCP握手也需要一些时间,但是我们可以忍受300毫秒(最坏的情况)的不应期。

分块响应:

客户端使用与数据流相对应的源创建隐藏的iFrame。服务器立即以HTTP响应标头进行响应,并使连接保持打开状态。要发送消息,服务器将其包装在一对<script></script>标记中,当浏览器收到结束标记时,该标记就会由浏览器执行。好处是没有重新打开连接,但每条消息都有更多开销。此外,这需要响应调用的全局范围内的回调。

另外,由于跨域iFrame通信会带来其自身的问题,因此不能与跨域请求一起使用。信任服务器的需求在这里也是一个挑战。

Web套接字:

它们以普通的HTTP连接开始,但稍后实际上并没有遵循HTTP协议。从编程的角度来看,事情尽可能简单。该API在客户端是经典的打开/回调样式,服务器仅将消息推送到打开的套接字中。无需在每个消息后重新打开任何内容。

仍然需要保持开放的连接,但这实际上并不是浏览器限制的问题。浏览器知道该连接将打开一段时间,因此不需要对普通请求使用相同的限制。

这些似乎是理想的解决方案,但是存在一个主要问题:IE <10不知道它们。只要IE8仍然存在,就不能依赖Web套接字。此外,本地Android浏览器和Opera mini也已退出(ref.)。

不过,一旦IE8(和IE9)最终死亡,Web套接字似乎仍然是解决之道。



您看到的是具有25秒超时的挂起请求,这些请求用于实现实时更新功能。正如我已经说过的那样,使用了保持活动消息(“ h”),以使浏览器不会认为它不会得到响应。 “ h”仅表示“什么都没有发生”。

Chrome支持Web套接字,因此Meteor可以将它们用于对长请求的回退,但是,坦率地说,一旦实现了挂起请求,它们就一点也不坏(请确保浏览器连接限制仍然适用)。

关于javascript - 防止XmlHttpRequest递归调用服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14038252/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com