เรากำลังประสบกับพฤติกรรมการปรับลดรุ่น http2-to-http1.1 ของ IIS 10 ที่เราไม่เข้าใจจริงๆ เราได้ติดตั้ง REST API (ส่วนหน้า: เชิงมุม, แบ็กเอนด์: php (โดยใช้ laminas-api-tools) สำหรับคำขอ GET, POST และ PUT ของเรา ทุกอย่างปกติดี อย่างไรก็ตาม เมื่อเราส่งคำขอ DELETE ที่ควรได้รับคำตอบ ตามรหัสสถานะ 204 สิ่งต่อไปนี้จะเกิดขึ้น:
- สามารถดูคำขอได้ในบันทึก IIS ซึ่งมาทาง http/2 ซึ่งได้รับคำตอบจากสถานะ 204 และ win32 87 (ความหมาย: พารามิเตอร์ไม่ถูกต้อง)
- ถัดไป คำขอเดิมสามารถเห็นได้อีกครั้งในบันทึก IIS คราวนี้ใช้ http/1.1 ตอบกลับด้วย 406 (ไม่ยอมรับ)
2022-03-02 13:29:38 192.168.76.64 ลบ /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 ลบ /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 เกิดขึ้นเนื่องจากในคำขอแรก องค์ประกอบถูกลบจริง (ดังนั้นคำขอที่สองจึงล้มเหลวโดย "ไม่มีองค์ประกอบ")
ในเบราว์เซอร์ เราจะเห็นเฉพาะการตอบกลับครั้งที่สองเท่านั้น (406) คำขอ DELETE ที่ตามมาทั้งหมด (ไปยังองค์ประกอบอื่นๆ) ทำงานได้ดีจากที่นั่น (เนื่องจากเกิดขึ้นที่ http/1.1 สำหรับเซสชันเบราว์เซอร์ที่เหลือ) แม้ว่าองค์ประกอบจะถูกลบไปแล้วและการลบที่ตามมาจะทำงานได้อย่างไม่มีที่ติ พฤติกรรมนี้เป็นประสบการณ์ที่ไม่พึงประสงค์ของผู้ใช้
อย่างไรก็ตาม เราไม่สามารถทราบได้ว่าอะไรเป็นสาเหตุของการดาวน์เกรด http1.1 นี้ เอกสาร IIS พูดต่อไปนี้เท่านั้น (จาก https://docs.microsoft.com/en-us/iis/get-started/whats-new-in-iis-10/http2-on-iis#when-is-http2-not-supported):
HTTP/2 ไม่รองรับเมื่อใด
ในบางกรณี ไม่สามารถใช้ HTTP/2 ร่วมกับอย่างอื่นได้
คุณสมบัติ. ในสถานการณ์เหล่านี้ Windows จะถอยกลับไปใช้ HTTP/1.1 และ
ทำรายการต่อไป ซึ่งอาจเกี่ยวข้องกับการเจรจา HTTP/1.1 ในระหว่าง
การจับมือหรือส่งรหัสข้อผิดพลาดไปยังไคลเอนต์ที่สั่ง
เพื่อลองอีกครั้งผ่านการเชื่อมต่อ HTTP/1.1
- HTTP/2 ไม่รองรับการรับรองความถูกต้องของ Windows (NTLM/Kerberos/Negotiate) ในกรณีนี้ IIS จะถอยกลับเป็น HTTP/1.1
- ข้อความที่ชัดเจน - ตามที่กล่าวไว้ข้างต้น ปัจจุบัน IIS รองรับ HTTP/2 ผ่าน TLS เท่านั้น อีกครั้ง IIS จะถอยกลับเป็น HTTP/1.1
- การควบคุมปริมาณแบนด์วิดท์ - IIS มีคุณสมบัติในการจำกัดแบนด์วิดท์ (ใน Inetmgr ให้เลือกไซต์ 'จำกัด ' ภายใต้การกำหนดค่าของการดำเนินการ
บานหน้าต่าง). สิ่งนี้ใช้กับ HTTP/1.1 แต่ไม่ได้บังคับใช้กับ HTTP/2 (จะ
ดำเนินการโดยไม่มีข้อผิดพลาดหรือจำกัดแบนด์วิธ)
อย่างไรก็ตาม เราไม่ได้ใช้การรับรองความถูกต้องของ windows (หากเป็นเช่นนั้น การเรียก API ใดๆ จะล้มเหลว ไม่ใช่แค่ DELETE) หรือการควบคุมปริมาณแบนด์วิดท์ นอกจากนี้ ฉันพบว่าไม่น่าเป็นไปได้อย่างมากที่หัวข้อ "ข้อความที่ชัดเจน" จะมีบทบาทสำหรับเรา เนื่องจากการสื่อสารใดๆ เกิดขึ้นผ่าน https/TLS
จึงต้องมีเหตุอื่น
เรายังวิเคราะห์การตอบสนองจากลามินา แต่ไม่สามารถหาคำอธิบายที่เป็นไปได้ - สิ่งที่เราพบคือการส่งรหัสสถานะที่แตกต่างจาก 204 ช่วยแก้ปัญหาได้จริง นั่นคือวิธีแก้ปัญหาปัจจุบันของเรา: ส่ง 200 แทน 204 เป็นรหัสตอบกลับ DELETE
อย่างไรก็ตาม เราคิดว่าน่าจะเป็นแนวทางปฏิบัติที่ดีที่สุดสำหรับผู้ใช้ 204 แทน
แหล่งข้อมูลอื่น ๆ สำหรับการวิจัย ได้แก่ :
ใครสามารถช่วยเราในการทำความเข้าใจสิ่งที่อาจทำให้เกิดปัญหาที่นี่?
ขอบคุณมากล่วงหน้า Jan