Chúng tôi đang gặp phải hành vi hạ cấp http2 xuống http1.1 của IIS 10 mà chúng tôi không thực sự hiểu. Chúng tôi đã triển khai API REST (giao diện người dùng: Angular, phụ trợ: php (sử dụng laminas-api-tools). Đối với các yêu cầu GET, POST và PUT của chúng tôi, mọi thứ đều ổn. Tuy nhiên, khi chúng tôi gửi một yêu cầu XÓA lẽ ra phải được trả lời theo mã trạng thái 204, điều sau đây sẽ xảy ra:
- yêu cầu có thể được nhìn thấy trong nhật ký IIS, đến qua http/2, được trả lời bởi trạng thái 204 và win32 87 (có nghĩa là: tham số không chính xác)
- tiếp theo, yêu cầu chính xác tương tự có thể được nhìn thấy lại trong nhật ký IIS, lần này sử dụng http/1.1, được trả lời bằng 406 (không được chấp nhận)
2022-03-02 13:29:38 192.168.76.64 DELETE /myapplication/90/public/api/v1/elements/7 - 443 - 10.0.0.21 HTTP/2 Mozilla/5.0+(Macintosh;+Intel+Mac+OS +X+10_15_7)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/98.0.4758.109+Safari/537.36 https://my.server.de/myapplication/90/public/ui/elements 204 0 87 125
2022-03-02 13:29:39 192.168.76.64 DELETE /myapplication/90/public/api/v1/elements/7 - 443 - 10.0.0.21 HTTP/1.1 Mozilla/5.0+(Macintosh;+Intel+Mac+OS +X+10_15_7)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/98.0.4758.109+Safari/537.36 https://my.server.de/myapplication/90/public/ui/elements 406 0 0 189
406 xảy ra vì trong yêu cầu đầu tiên, phần tử thực sự bị xóa (vì vậy yêu cầu thứ hai không thành công với "Phần tử không tồn tại").
Trong trình duyệt, chúng tôi chỉ có thể thấy phản hồi thứ hai (406). Tất cả các yêu cầu XÓA tiếp theo (đối với các phần tử khác) đều hoạt động tốt từ đó trở đi (vì chúng xảy ra trên http/1.1 trong phần còn lại của phiên trình duyệt). Mặc dù phần tử đã bị xóa và các thao tác xóa tiếp theo hoạt động hoàn hảo, nhưng hành vi này gây ra trải nghiệm người dùng rất khó chịu.
Tuy nhiên, chúng tôi không thể tìm ra nguyên nhân thực sự gây ra việc hạ cấp http1.1 này. Tài liệu IIS chỉ nói như sau (từ https://docs.microsoft.com/en-us/iis/get-started/whats-new-in-iis-10/http2-on-iis#when-is-http2-not-supported):
Khi nào HTTP/2 không được hỗ trợ?
Trong một số trường hợp, không thể sử dụng HTTP/2 kết hợp với các
Tính năng, đặc điểm. Trong những trường hợp này, Windows sẽ quay trở lại HTTP/1.1 và
tiếp tục giao dịch. Điều này có thể liên quan đến việc đàm phán HTTP/1.1 trong quá trình
cái bắt tay hoặc gửi mã lỗi đến máy khách để hướng dẫn nó
để thử lại qua kết nối HTTP/1.1.
- Xác thực Windows (NTLM/Kerberos/Thương lượng) không được hỗ trợ với HTTP/2. Trong trường hợp này, IIS sẽ chuyển về HTTP/1.1.
- Xóa văn bản - như đã đề cập ở trên, IIS hiện chỉ hỗ trợ HTTP/2 qua TLS. Một lần nữa, IIS sẽ quay trở lại HTTP/1.1.
- Điều chỉnh băng thông - IIS có tính năng giới hạn băng thông (trong Inetmgr, chọn trang web, 'Giới hạn' trong Cấu hình hành động
ngăn). Điều này áp dụng cho HTTP/1.1 nhưng không được thực thi cho HTTP/2 (sẽ
tiến hành không có lỗi hoặc giới hạn băng thông).
Tuy nhiên, chúng tôi không sử dụng xác thực cửa sổ (nếu vậy, mọi lệnh gọi API sẽ không thành công, không chỉ XÓA) cũng như điều chỉnh băng thông. Ngoài ra, tôi thấy rất khó có khả năng chủ đề "văn bản rõ ràng" đóng một vai trò nào đó đối với chúng tôi, bởi vì mọi giao tiếp đều diễn ra qua https/TLS.
Vì vậy, nó phải là một số nguyên nhân khác.
Chúng tôi cũng đã phân tích phản hồi từ laminas nhưng không thể tìm ra lời giải thích khả thi - điều chúng tôi phát hiện ra là việc gửi mã trạng thái khác với 204 thực sự giải quyết được vấn đề. Đó là giải pháp hiện tại của chúng tôi: gửi 200 thay vì 204 như mã phản hồi XÓA.
Tuy nhiên, chúng tôi nghĩ rằng thay vào đó, đó sẽ là phương pháp hay nhất đối với người dùng 204.
Các nguồn nghiên cứu khác bao gồm:
Ai có thể giúp chúng tôi hiểu những gì có thể gây ra vấn đề ở đây?
Cảm ơn rất nhiều trước, Jan