Konteks HTTP Go Gagal Mengesan Isyarat Pembatalan dengan Badan Permintaan
Dalam pelayan HTTP Go, isyarat konteks boleh menyediakan mekanisme untuk mengendalikan pemutusan sambungan pelanggan , membenarkan pelayan membersihkan sumber dengan segera. Walau bagaimanapun, apabila permintaan termasuk badan, saluran Selesai konteks terhenti, menghalang pelayan daripada mengesan pemergian pelanggan.
Punca Tingkah Laku
Sebab kelakuan ini terletak pada cara pelayan HTTP membaca sambungan. Sehingga badan permintaan dibaca, tiada semakan untuk sambungan tertutup dilakukan. Dalam kes permintaan GET, tiada badan hadir, jadi pelayan secara aktif memantau sambungan. Walau bagaimanapun, dengan permintaan POST, badan itu menduduki pembaca yang tidak menyekat, menangguhkan pemeriksaan sambungan.
Penyelesaian
Untuk menyelesaikan isu ini, baca secara eksplisit badan permintaan dalam fungsi pengendali. Tindakan ini mencetuskan pemantauan sambungan pelayan, memastikan ia dapat mengesan pemutusan sambungan pelanggan dengan segera.
Contoh Kod
func handler(w http.ResponseWriter, r *http.Request) { go func(done <-chan struct{}) { <-done fmt.Println("message", "client connection has gone away, request got cancelled") }(r.Context().Done()) // Explicitly read the body to trigger connection monitoring io.Copy(ioutil.Discard, r.Body) time.Sleep(30 * time.Second) fmt.Fprintf(w, "Hi there, I love %s!\n", r.URL.Path[1:]) }
Pengubahsuaian ini menggesa pelayan membaca kandungan permintaan serta-merta, memulakan proses pemantauan sambungan. Akibatnya, pelayan kini boleh mengesan pemutusan sambungan pelanggan dengan berkesan, walaupun dengan kehadiran badan permintaan.
Atas ialah kandungan terperinci Mengapa Konteks HTTP Go Tidak Mengesan Isyarat Pembatalan dengan Badan Permintaan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!