HTTP状态码0 – 这对于读取或XMLHttpRequest有什么意义?

对于JavaScriptnetworking调用获取,XMLHttpRequest和MS XMLHTTP的返回代码0,我有一个使用标准的MS XMLHTTP COM对象( Microsoft.XMLHTTPMsxml2.XMLHTTP取决于)的HTA(Microsoft HTML应用程序 – 脱机HTML + JavaScript应用程序)版本检测)通过JavaScript代码发送一些数据返回到服务器。

它返回状态代码0.这显然不是一个有效的HTTP状态代码(根据官方规范,它们应该是三位)。 (顺便说一下,我试图拔掉networking连接,并得到了状态代码17003或什么,我认为从大量的谷歌search意味着“DNS服务器查找失败”)。

对于我和其他一些从不同地点进行testing的人来说,它工作的很好。 但是,我已经发送到客户端,他们已经收到一个HTTP状态码为零,HTTP响应文本是空白的。 客户已经从两个地方尝试过,但都在公司networking中。

这是一个到互联网上的HTTP URL的HTTP POST(不是一个file://请求,我知道在Mozilla下也会返回状态码0)。 我敢肯定,这是一个失败的代码,因为它应该返回一些确认作为responseText ,我们没有得到数据库中logging的数据。

我相信错误代码表明响应是空的(甚至没有返回头)。 这意味着连接被接受,然后正常closures(TCP FIN)。 有很多事情可能会导致这种情况,但是根据您的描述,某种forms的防火墙似乎是最有可能的罪魁祸首。

这里的答案很多都是错误的。 似乎人们在他们的特定情况下找出导致状态== 0的原因,然后将其推广为答案。

实际上,对于失败的XmlHttpRequest,status == 0应该被认为是一个未定义的错误。

实际的W3C规范定义了返回零的条件: https : //fetch.spec.whatwg.org/#concept-network-error

正如你可以从spec(fetch或者XmlHttpRequest)看到的,这个代码可能是在联系服务器之前发生错误的结果。

产生这种状态代码的一些常见情况反映在其他答案中,但可能是这些问题中的任何一个或没有一个:

  1. 非法跨源请求(请参阅CORS )
  2. 防火墙阻止或过滤
  3. 请求本身在代码中被取消
  4. 已安装的浏览器扩展正在搞砸

浏览器为更多这些状态== 0场景提供详细的错误报告将是有帮助的。 的确,有时状态== 0会伴随一个有用的控制台消息,但在其他情况下则没有其他信息。

根据浏览器的不同,根据浏览器的不同,基于jQuery的AJAX调用将调用HTTP状态码为0的成功callback。我们发现状态码“0”通常意味着用户导航到不同的页面之前AJAX呼叫完成。

与您使用的技术不尽相同,但希望对某人有用。

wininet.dll返回下面列出的标准状态码和非标准状态码。

 401 - Unauthorized file 403 - Forbidden file 404 - File Not Found 500 - some inclusion or functions may missed 200 - Completed 12002 - Server timeout 12029,12030, 12031 - dropped connections (either web server or DB server) 12152 - Connection closed by server. 13030 - StatusText properties are unavailable, and a query attempt throws an exception 

对于状态码“零”,你是否试图在本地网页上运行一个网页服务器或没有networking服务器的请求?

XMLHttpRequest status = 0和XMLHttpRequest statusText = unknown可以帮助你,如果你没有在networking服务器上运行你的脚本。

解决方法:我们最终做了什么

我们认为这是与防火墙问题有关,所以我们提出了一个解决方法。 如果有人有这个相同的问题,这是我们所做的:

  1. 我们仍然使用HTA将数据写到本地硬盘上的文本文件中。

  2. 当用户点击“将数据发送回服务器”时,HTA读取数据,并将包含该数据的HTML页面写为XML数据岛(实际上使用SCRIPT LANGUAGE = XML脚本块)。

  3. HTA在浏览器中启动到HTML页面的链接。

  4. HTML页面现在包含将数据发布到服务器的JavaScript(使用Microsoft.XMLHTTP)。

希望这可以帮助任何有类似要求的人。 在这种情况下,这是一个在展会上使用笔记本电脑的Flash游戏。 我们从来没有访问过笔记本电脑,只能通过电子邮件发送给客户,因为这个展会正在另一个国家发生。

HTTP响应代码为0表示AJAX请求已被取消。

这可能发生在超时,XHRstream产或防火墙跺脚的请求。 超时是常见的,这意味着请求在指定的时间内未能执行。 一个XHRstream产很简单…你可以实际调用XMLHttpRequest对象上的.abort()来取消AJAX调用。 ( 如果您不希望AJAX调用返回并尝试引用已销毁的对象,那么这对于单个页面应用程序是很好的做法。 )正如标记的答案中所述,防火墙也可以取消请求并触发此操作0响应。

XHR中止: 使用jQuery中止Ajax请求

 var xhr = $.ajax({ type: "POST", url: "some.php", data: "name=John&location=Boston", success: function(msg){ alert( "Data Saved: " + msg ); } }); //kill the request xhr.abort() 

值得注意的是,在XHR对象上运行.abort()方法也会触发错误callback。 如果您正在做任何types的error handlingparsing这些对象,你会很快注意到一个被中止的XHR和超时XHR是相同的,但与jQuery传递给错误callback的textStatus将被中止时中止并发生超时“超时”。 如果您使用的是Zepto(与jQuery非常相似),那么errorType将在中止时为“错误”,在发生超时时为“超时”。

 jQuery: error(jqXHR, textStatus, errorThrown); Zepto: error(xhr, errorType, error); 

在我的情况下,当我忘记将WWW放在我的域名前时,状态变为0。 因为我的所有ajax请求都被硬编码为http:/WWW.mydomain.com,并且加载的网页只是http://mydomain.com ,因为它是一个不同的域,所以它成为一个安全问题。 我最终在我的.htaccess文件中做了一个redirect,总是把www放在前面。

正如本页回答详细描述的 ,状态码0表示由于某种原因请求失败,而JavaScript库将失败解释为状态码0。

要testing这个,你可以执行以下任一操作:

1)使用这个chrome扩展, 请求将你的url从你的url的https版本redirect到http版本,因为这会导致混合内容安全错误,并最终生成一个0的状态​​代码。这种方法的优点是你根本不需要改变你的应用程序,你可以简单地使用这个扩展名“重写”你的url。

2)更改yoru应用程序的代码,以便可选地使您的端点redirect到您的url的http版本,而不是https版本(反之亦然)。 如果这样做,请求将失败,状态码为0。

在我的情况下,这是因为AJAX调用由于同源策略而被浏览器阻止。 这是最不值得期待的事情,因为我所有的HTML和脚本都来自于127.0.0.1 。 他们怎么会被认为是不同的起源?

无论如何,根本原因是一个无辜的<base>标签:

 <base href='<%=request.getScheme()%>://<%=request.getServerName() + ":" + request.getServerPort() + request.getContextPath()%>/'/> 

我删除了<base>标签,这是我不需要的方式,现在它工作正常!

万一有人遇到这个问题,这是由于AJAX请求和正常的表单请求被发送给我的问题。 我用下面一行来解决它:

 <form onsubmit="submitfunc(); return false;"> 

关键是返回false,导致表单不发送。 你也可以从submitfunc()里面返回false,但是我明确地写出来更清晰。

应该注意的是,一个超过nginx的client_max_body_size指令的ajaxfile upload将返回这个错误代码。

我发现一个新的和无证的原因状态== 0.这是我有:

 XMLHttpRequest.status === 0 XMLHttpRequest.readyState === 0 XMLHttpRequest.responseText === '' XMLHttpRequest.state() === 'rejected' 

这不是交叉来源,networking或由于取消请求(通过代码或用户导航)。 开发者控制台或networking日志中没有任何内容

我可以在state()find很less的文档(Mozilla没有列出它,W3C),没有提到“被拒绝”。

原来,这是我的广告拦截器 (在Firefox的uBlock起源)。