2017-09-14 21 views
19

Gần đây tôi đã gặp khó khăn với vấn đề siêu lạ chỉ xảy ra trong Chrome: vì API của tôi (NodeJS) nằm trên tên miền phụ khác, tôi cần sử dụng CORS để tiếp cận nó từ phía trước -end (EmberJS).TÙY CHỌN preflight siêu chậm trong Chrome chỉ

Nó hoạt động khá tốt nhưng tôi rất thường xuyên (95% thời gian) có các truy vấn OPTIONS rất rất chậm, trì hoãn bất kỳ cuộc gọi API nào trong khoảng 3 giây.

2 requests, OPTIONS takes 3 seconds

Hầu hết thời gian này được chi tải một nội dung rỗng:

Downloading an empty content takes 3 seconds

Nó được thậm chí lạ khi tôi đang cố gắng này trên một trang web khác, chúng tôi đã sử dụng một kiến ​​trúc tương tự, trải qua chính xác cùng một vấn đề.

Một vài điều khác tôi đã cố gắng:

  • Tôi đã cố gắng này với Firefox và Safari, và đã không nhận được bất kỳ sự chậm trễ.
  • Tôi đã thử tính năng này tại địa phương hoặc trong quá trình sản xuất, thử nghiệm sự chậm trễ tương tự.
  • Tôi đã thử điều này với chế độ ẩn danh (không có tiện ích mở rộng) và tôi có cùng một vấn đề.

Chúng tôi đang sử dụng trên NodeJS back-end với CORS package.

Bây giờ, tôi không biết liệu sự cố xảy ra trên Chrome 60, NodeJS, gói CORS hay EmberJS + jQuery.

Bất kỳ ai cũng trải nghiệm điều này?

+1

Có lẽ bạn có thể làm thủ công 'yêu cầu OPTIONS' với 'curl' hoặc một số REST- thử như phục hồi? Bạn cũng có nghĩa là bạn không nhận được yêu cầu 'OPTIONS' trên Firefox hay yêu cầu' OPTIONS' là nhanh? – Lux

+0

@Lux Tôi đã thử với Postman để phát lại yêu cầu OPTIONS và không gặp phải độ trễ. Firefox thực hiện yêu cầu OPTIONS nhưng nó không chậm. –

+1

Tôi biết có thể âm thanh hơi lạ nhưng điều này sẽ thông qua một proxy http tôi có nghĩa là mã ember khi gọi api là nó đi qua một proxy http? – vaibhav

Trả lời

4

Cũng giống như một lưu ý: Có vẻ như một lỗi chrome

tôi sao chép các vấn đề sử dụng một máy chủ với hai tên DNS sử dụng một dịch vụ trong một miền duy nhất

https://domain1.com --> https://domain1.com (No CORS, no delay) 
https://domain2.com --> https://domain1.com (CORS, delay) 

chrome cors

Nó chính xác là cùng một dịch vụ đáp ứng hai tên, vì vậy tôi đang kiểm tra chính xác cùng một yêu cầu, mã máy khách và máy chủ (tên DNS có thể hoán đổi cho nhau)

Thử nghiệm với

  • Chrome 61.0.3163.100 (Windows) -> TRÌ HOÃN
  • Chrome 62.0.3202.84 (Android) -> TRÌ HOÃN
  • Chrome 62.0.3202.84 (iOS-Ipad) - > OK !!!
  • Firefox -> OK
  • Edge -> OK

Cách giải quyết (trong trường hợp của tôi).Tạo proxy trong máy chủ của tôi để phản hồi cùng một nguồn gốc DNS và tránh CORS

+0

Phụ trợ của bạn là gì? –

+0

Apache + Tomcat (java 7) – pedrofb

2

Tôi đã tìm cách gỡ lỗi này và dường như là lỗi chrome vì chúng tôi đã gặp sự cố tương tự.

Để tham khảo, tôi đã đệ trình một báo cáo lỗi để crom ở đây: CORS pre-flight and subsequent requests are very slow only on Chrome

tôi thêm này ở đây để giúp ngăn chặn hơn bất kỳ nhà phát triển dành nửa ngày điều tra nó;) Sẽ cập nhật khi chúng ta ở đây nhiều hơn từ Chromium.

Tổng quan về báo cáo lỗi sau:

UserAgent:

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

bước để tạo lại vấn đề:

  1. Có app.domain.com
  2. Lis t mục
  3. Có api.domain.com
  4. Enable CORS trên API để cho phép truy cập
  5. Kiểm tra phản ứng trong DevTools, xem OPTIONS và GET yêu cầu được tham gia lên đến 300ms +

gì được mong đợi hành vi?

Thời gian phản hồi phải chính xác.

Điều gì đã xảy ra?

Chúng tôi đang sử dụng dịch vụ micros microsices và nhận thấy sự chênh lệch lớn về thời gian giữa các trình duyệt - chrome là chậm nhất tới 100x.

khi chúng tôi đã kiểm tra thời gian từ chương trình phụ trợ, các câu trả lời mất tối đa 10ms, với hầu hết là phụ 1ms. Khi kiểm tra thời gian theo devtools, các phản hồi tương tự sẽ xuất hiện ở ~ 100ms ~ 1s.

Công việc này có hiệu quả không?

N/A

Chrome phiên bản: 63.0.3239.132 Channel: ổn định OS Version: 10,0 Phiên bản Flash:

Trong Firefox (và bất kỳ trình duyệt khác), các yêu cầu chính xác cùng trở lại trong ~ 1-20ms như mong đợi.

Khi cố gắng chẩn đoán thêm, chúng tôi đã sử dụng Fiddler của Telerik để kiểm tra thời gian phản hồi mạng thực tế và xác nhận rằng chúng đã được Chrome gửi và nhận trong thời gian dự kiến ​​của chúng tôi. Kết luận duy nhất chúng tôi có thể đến là nội dung nào đó bên trong Chrome đang làm chậm quá trình xử lý các yêu cầu này.

Chúng tôi đã thử tất cả các hoán vị của chrome://flags#out-of-blink-corschrome://flags#enable-site-per-process, đó là hai tùy chọn mà chúng tôi phát hiện có vẻ mơ hồ có liên quan. Không có gì có vẻ để giúp đỡ.

Chúng tôi cũng đã tìm thấy nhiều bài viết Stack Overflow về một vấn đề tương tự mà làm cho đề cập đến nó là một lỗi Chrome, nhưng tôi đã không thể tìm thấy nó thông báo ở đây:

Chúng tôi vừa thử nghiệm Chrome trên hệ điều hành MacOS và nó không xuất hiện là một vấn đề - như vậy có thể được giới hạn trong Windows.

Chrome: optionsChrome getChrome

Edge: optionsEdge getEdge

Firefox: optionsFirefox getFirefox

+1

Trong khi liên kết này có thể trả lời câu hỏi, tốt hơn nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. - [Từ đánh giá] (/ đánh giá/bài đăng chất lượng thấp/18561203) –

Các vấn đề liên quan