1. Pagrindiniai faktai
- Nuolatinės ryšio problemos: nenuolatinių ryšių atveju naršyklė gali apibrėžti užklausos arba atsakymo objekto ribas pagal tai, ar ryšys neveikia, ar ne; Nuolatiniams ryšiams šis metodas akivaizdžiai neveikia. Kartais, net jei išsiunčiau visus duomenis, naršyklė nežino, ar bus naujų duomenų apie atvirą ryšį, todėl tiesiog laukia.
- Išspręskite naudodami turinio ilgį: apskaičiuokite objekto ilgį ir pasakykite kitai šaliai per galvą. Naršyklė gali nustatyti, kad atsakymo objektas baigėsi pagal turinio ilgio informaciją
- Nauja turinio ilgio problema: Kadangi turinio ilgio laukas turi iš tikrųjų atspindėti objekto ilgį, dinamiškai sugeneruoto turinio ilgis nežinomas, kol turinys nebus sukurtas. Šiuo metu, norėdami tiksliai gauti ilgį, prieš skaičiuodami galite atidaryti tik pakankamai didelį buferį ir palaukti, kol bus sugeneruotas visas turinys. Tačiau, viena vertus, tam reikia daugiau atminties pridėtinių išlaidų, kita vertus, klientas lauks ilgiau.
- Mums reikia naujo mechanizmo, kuris nepasikliautų antraštės ilgiu ir žinotų objektų ribas - Transfer-Encoding: chunked.
2. Perdavimo kodavimas (fragmentais)
- Transfer-Encoding yra HTTP antraštės laukas (atsakymo antraštės laukas), kuris pažodžiui reiškia "perdavimo kodavimas". Naujausioje HTTP specifikacijoje apibrėžiamas tik vienas kodavimo transportavimo tipas: fragmentas.
- Fragmentinis perdavimo kodavimas yra duomenų perdavimo mechanizmas hiperteksto perdavimo protokole (HTTP), leidžiantis padalyti HTTP duomenis, kuriuos žiniatinklio serveris siunčia klientui, į kelias dalis. Blokų transportavimo kodavimas galimas tik HTTP protokolo 1.1 versijoje (HTTP/1.1).
- Duomenys suskaidomi į keletą dalių ir siunčiami į vieną ar daugiau dalių, kad serveris galėtų siųsti duomenis iš anksto nežinodamas bendro išsiųsto turinio dydžio.
Konkretūs metodai
- Pridėjus Transfer-Encoding: chunked į antraštę, tai reiškia, kad paketas yra padalintas. Tokiu atveju paketo subjektai turi būti perduodami dalimis.
- Kiekviename gabale yra šešioliktainė ilgio reikšmė ir duomenys, o ilgio reikšmė yra išskirtinė vienai eilutei, o ilgis neapima CRLF jos pabaigoje ir CRLF duomenų pabaigoje.
- Paskutinė segmento ilgio reikšmė turi būti 0, o atitinkami segmento duomenys neturi turinio, nurodančio objekto pabaigą.
asp.net Pagrindinis bandymo kodas:
|