防止XmlHttpRequest对服务器的递归调用

soh*_*ifa 1 javascript xmlhttprequest meteor

我一直在谷歌搜索这个问题几个小时,但没有找到任何解决方案.

我目前正在对这个应用程序,内置的流星.

现在的情况是,在网站打开并且所有资产都已经在浏览器中加载之后,浏览器不断地对服务器进行递归xhr调用.这些呼叫以25秒的固定间隔进行.

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

在此输入图像描述

我无法弄清楚它来自何处,以及为什么即使用户空闲也会自动调用它.

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

任何帮助都会得到满足.

[UPDATE]

回应Jan Dvorak的评论:

当我在搜索框中输入"e"时,将显示名称以字母"e"开头的事件列表.

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

["{\"msg\":\"sub\",\"id\":\"8ef5e419-c422-429a-907e-38b6e669a493\",\"name\":\"event_Coll_Search_by_PromoterName\",\"params\":[\"e\"]}"]
Run Code Online (Sandbox Code Playgroud)

这是响应,这是有效的.

a["{\"msg\":\"data\",\"subs\":[\"8ef5e419-c422-429a-907e-38b6e669a493\"]}"]
Run Code Online (Sandbox Code Playgroud)

此操作的代码发布在此处

但是在自动递归请求的情况下,请求没有有效载荷,响应只是字母"h",这很奇怪.不是吗?我怎么能摆脱这个.

Joh*_*rak 6

Meteor有一个叫做的功能

实时页面更新.

只需编写模板即可.它们会在数据库中的数据发生更改时自动更新 不再需要编写样板重绘代码.支持任何模板语言.

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


传统上,HTTP是为了获取死数据而创建的.客户端告诉服务器它需要一些东西,它会得到一些东西.服务器无法告诉客户端它需要什么.后来,需要将一些数据推送到客户端.有几种替代方案存在:

轮询:

客户端定期向服务器发出请求.服务器响应新数据或立即说"无数据".它易于实现,并且不会占用太多资源.然而,它并不完全是现场.它可以用于新闻自动收报机,但它对于聊天应用程序并不完全合适.

如果增加轮询频率,则可以提高更新速率,但资源使用率会随着轮询频率而增加,而不会随着数据传输速率而增加.HTTP请求并不是很便宜.同时来自多个客户端的每秒一个请求可能真的伤害了服务器.

挂起请求:

客户端向服务器发出请求.如果服务器有数据,则发送它们.如果服务器没有数据,则直到它没有响应.立即获取更改,不需要时不传输任何数据.但它确实有一些缺点:

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

挂起请求不会占用(很多)带宽,但它们会占用内存.现在,'服务器可以处理多个并发TCP连接,因此它不像以前那样存在问题.需要考虑的是与持有这些请求的线程相关联的内存量 - 尤其是当连接与为其提供服务的特定线程相关联时.

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

管理挂起请求感觉有点手动,因为您必须在每次响应后发出新请求.TCP握手也需要一些时间,但我们可以忍受300毫秒(最糟糕的)不应期.

分块响应:

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

此外,这不能与跨域请求一起使用,因为跨域iFrame通信会出现其自身的一组问题.信任服务器的需求也是一个挑战.

网络套接字:

它们以普通的HTTP连接开始,但实际上它们实际上并不遵循HTTP协议.从编程的角度来看,事情就像它们一样简单.API是客户端的经典开放/回调样式,服务器只是将消息推送到打开的套接字.每条消息后都无需重新打开任何内容.

仍然需要一个开放的连接,但这不是一个真正的问题,浏览器限制的方式.浏览器知道连接将暂时打开,因此它不需要应用与正常请求相同的限制.

这些似乎是理想的解决方案,但有一个主要问题:IE <10不知道它们.只要IE8还活着,就无法依赖网络套接字.此外,本机Android浏览器和Opera mini也出来了(参考).

尽管如此,一旦IE8(和IE9)最终死亡,网络套接字似乎就是这样.


您看到的是挂起请求,超时为25秒,用于实现实时更新功能.正如我已经说过的那样,使用了保持活动消息("h"),这样浏览器就不会认为它不会得到响应."h"仅仅意味着"没有任何反应".

Chrome支持网络套接字,因此Meteor可能会使用它们来回退长请求,但是,坦率地说,挂起请求一旦实现就完全没有坏处(当然,浏览器连接限制仍然适用).