仅限Chrome中的超慢速预检OPTIONS

Ben*_*ter 25 jquery google-chrome node.js cors ember.js

最近我一直在努力解决Chrome中出现的一个非常奇怪的问题:由于我的API(NodeJS)位于不同的子域,我需要使用CORS从我的前端(EmberJS)到达它.

它工作得很好,但我经常(95%的时间)拥有非常慢的OPTIONS查询,将任何API调用延迟大约3秒.

2个请求,OPTIONS需要3秒

大部分时间花在下载空内容上:

下载空内容需要3秒钟

当我在另一个使用类似架构制作的网站上尝试这个时,它会变得更奇怪,遇到完全相同的问题.

我试过的其他一些事情:

  • 我一直在尝试使用Firefox和Safari,并且没有任何延迟.
  • 我一直在本地或生产中尝试这种方法,试验同样的延迟.
  • 我一直在用隐身模式(没有扩展名)尝试这个,我有完全相同的问题.

我们在后端NodeJS上使用CORS包.

现在,我不知道问题出在Chrome 60,NodeJS,CORS包还是EmberJS + jQuery上.

有没有人经历过这个?

ped*_*ofb 5

就像一张纸条:它似乎是一个铬虫

我使用具有两个DNS名称的服务器使用独特域中的服务重现了该问题

https://domain1.com  --> https://domain1.com (No CORS, no delay)
https://domain2.com  --> https://domain1.com (CORS, delay)
Run Code Online (Sandbox Code Playgroud)

铬杯

它是响应两个名称的完全相同的服务,所以我测试完全相同的请求,客户端和服务器代码(DNS名称是可互换的)

经过测试

  • Chrome 61.0.3163.100(Windows) - > DELAY
  • Chrome 62.0.3202.84(Android) - > DELAY
  • Chrome 62.0.3202.84(iOS-Ipad) - >好的!
  • 火狐 - >确定
  • 边缘 - >好的

解决方法(在我的情况下).在我的主机中创建代理以响应相同的源DNS并避免CORS


Mat*_*nge 4

我一直在寻求调试这个问题,这似乎是一个 chrome 错误,因为我们遇到了同样的问题。

作为参考,我在这里向 chromium 提交了一份错误报告:CORS pre-flight and 随后的请求仅在 Chrome 上非常慢

我在这里添加这个是为了帮助阻止更多的开发人员花半天的时间来调查它;)我们将在此处更新更多来自 Chromium 的信息。

错误报告概述如下:

用户代理:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36

重现问题的步骤:

  1. 拥有 app.domain.com
  2. 项目清单
  3. 有 api.domain.com
  4. 在 API 上启用 CORS 以启用访问
  5. 检查 DevTools 中的响应,查看 OPTIONS 和 GET 请求最多花费 300 毫秒以上

预期的行为是什么?

响应时间应该准确。

什么地方出了错?

我们正在使用 Go 微服务,并注意到浏览器之间的时间差异很大 - Chrome 是最慢的,达到了 100 倍。

当我们检查后端的计时时,响应最多需要 10 毫秒,其中大多数不到 1 毫秒。在开发工具下检查计时时,在 ~100ms~1s 时出现相同的响应。

这之前有用吗?

不适用

Chrome 版本:63.0.3239.132 频道:稳定 操作系统版本:10.0 Flash 版本:

在 Firefox(以及任何其他浏览器)中,完全相同的请求将按预期在约 1-20 毫秒内返回。

为了进一步诊断,我们使用 Telerik 的 Fiddler 检查实际的网络响应时间,并确认 Chrome 在我们的预期时间内发送和接收它们。我们得出的唯一结论是 Chrome 内部的某些东西正在减慢这些请求的处理速度。

我们尝试了chrome://flags#out-of-blink-cors和的所有排列chrome://flags#enable-site-per-process,这是我们发现的两个似乎模糊相关的选项。似乎没有什么帮助。

我们还发现了许多关于类似问题的 Stack Overflow 文章,其中提到这是一个 Chrome 错误,但我还没有找到这里报告的情况:

我们刚刚在 MacOS 上测试了 Chrome,这似乎不是问题 - 因此可能仅限于 Windows。

铬合金: 选项Chrome 获取Chrome

边缘: 选项边缘 获取边缘

火狐浏览器: 选项火狐 获取火狐