加载资源失败:Safari 上的请求超时

Posted

技术标签:

【中文标题】加载资源失败:Safari 上的请求超时【英文标题】:Failed to load resource: Request timed out on Safari 【发布时间】:2015-09-17 08:44:49 【问题描述】:

我们的 Web 应用程序现在可以在大多数浏览器上正常运行一年多。 最近我们发现它在 Safari 上运行不佳。

很多操作最终都会出现以下错误:Failed to load resource: Request timed out。有趣的是动作实际上是正确执行的之后(大部分时间)。

查看错误时,似乎是有 ajax 请求时发生的。

首先我尝试通过执行以下操作来更改 ajax 超时设置:

 $.ajax(
      "type"      : methode,
      "dataType"  : "json",
      "url"       : url,
      "async"     : async,
      "data"      : donneesEnvoyees,
      "timeout"   : 60000
 )

这并没有改变任何东西,错误实际上是在大约 10 秒后出现的,小于定义的超时时间。

在互联网上阅读了一些内容后,我看到了一些关于指定 no-cache 的答案,以便 safari 不会将 post 参数保留在缓存中。 我不能说我完全理解这一点,但我仍然尝试了以下方式:

$.ajax(
     "type"      : methode,
     "headers"   :  "cache-control": "no-cache" , <-- added this line
     "dataType"  : "json",
     "url"       : url,
     "async"     : async,
     "data"      : donneesEnvoyees,
     "timeout"   : 60000
 )

如你所料,我仍然遇到同样的错误。

你知道发生了什么吗?为什么这个错误只发生在 Safari 而不是其他浏览器上?如何解决?

【问题讨论】:

js变量'methode'、'url'、'async'、'donneesEnvoyees'的值是多少?你在哪里调用ajax?任何涉及正则表达式的地方? 方法是 POST 或 GET。 url 是动作,async 在所有请求中大多是“false”,“donneesEnvoyees”是 post 参数。我在提交时调用 Ajax,没有涉及正则表达式。 你的ajax有error()函数吗?如果可以,您可以将其包含在问题中吗? 我想我遇到过这样的事情。能否给出服务器的预期返回值? @AminJafari 我的 ajax 没有 'error()' 函数,但有 'fail()' 函数。如果服务器发回一些数据,错误会显示在带有响应的对话框中,但在我的情况下,服务器不会发回任何数据。 【参考方案1】:

在您的 ajax 设置中设置 async: true。它将使浏览器保持连接并在收到响应后关闭。

【讨论】:

这适用于可以是异步的请求,但有时它是不可能的。无论如何,为什么 safari 会对同步请求做出这种反应? 根据我的经验和研究,Safari 只是自己覆盖了 ajax 设置上提供的超时,使用 10 秒。 奖励您赏金,因为您的回答有助于解决某些请求(不是全部)。我仍然不明白发生了什么以及如何真正修复它(也有同步请求)。【参考方案2】:

如果您从代码中删除dataType : "json",我认为您的问题将得到解决如果您的ajax 页面的返回不是正确的JSON 字符串。我注意到如果提供了dataType : "json" 并且返回数据不是JSON 类型,则$.ajax() 不会转到成功函数。

PS 有些东西,比如 AJAX 设置关键字 type, dataType, url 等不应该用双引号引起来。即使代码即使使用当前的方式也可以工作,但我提到的是正确的方式。

$.ajax(
      type      : methode,
      dataType  : "json",
      url       : url,
      async     : async,
      data      : donneesEnvoyees,
      timeout   : 60000,
      success   : function(data)
                alert('success');
      
);

我假设您已经通过这个 ajax 调用添加了一个 success 函数,您可以使用它来根据结果使用不同的操作。

【讨论】:

返回值始终是正确的 JSON 字符串,所以我认为这不是问题所在。关于你的假设,我没有“成功()”功能,但有“完成()”功能【参考方案3】:

我遇到了同样的问题。通过将 CORS 标头和响应状态代码添加为 200

进行了修复
 res.header('Access-Control-Allow-Origin', '*');
 res.status(200);

方法和原因

通过阅读 jQuery 的源代码深入了解错误后,我意识到真正的问题是 jQuery+Safari 中的 XMLHttpRequest 调用 onError 并带有 http 状态码0。所以我添加了CORS头并给它一个200状态码来解决问题。

【讨论】:

似乎是一个很好的解决方案!但是什么是资源? .-) 必须在代码中的何处设置?听起来这是“相同”的问题:***.com/questions/53732617/…?

以上是关于加载资源失败:Safari 上的请求超时的主要内容,如果未能解决你的问题,请参考以下文章

Java:连接请求超时是啥意思?超时就不再请求了?

处理多部分/表单数据请求失败。读取超时

你了解微服务的超时传递吗?

如何从XPages / dojo中的“超时超时”中恢复

多个 HTTP 请求触发 HTTP Client 超时

OPENSSL s_cient 请求失败(408 请求超时)