1. Háttér:
- Tartós kapcsolati problémák: Nem tartós kapcsolatok esetén a böngésző meghatározhatja a kérő vagy válasz entitás határait annak alapján, hogy a kapcsolat leáll-e vagy sem; Folyamatos kapcsolatoknál ez a megközelítés nyilvánvalóan nem működik. Néha, bár elküldtem az összes adatot, a böngésző nem tudja, hogy jön-e új adat a nyitott kapcsolaton, így csak vár.
- Oldd meg a tartalomhosszsal: Számold ki az entitás hosszát, és mondd el a másik félnek a fejen keresztül. A böngésző a Tartalom-Hossz hosszának információja alapján tudja megállapítani, hogy a válasz entitás vége van
- Új probléma a tartalomhosszal: Mivel a tartalomhossz mezőnek valóban tükröznie kell az entitás hosszát, a dinamikusan generált tartalom hossza ismeretlen, amíg a tartalom el nem jön létre. Ekkor, hogy pontosan megkapd a hosszt, csak elég nagy puffert nyithatsz, és megvárod, hogy az összes tartalom generálódjon, mielőtt kiszámítanád. Ez azonban egyrészt több memóriaigényt igényel, másrészt pedig tovább várakozik a kliensnek.
- Olyan új mechanizmusra van szükségünk, amely nem a fejléc hosszán alapul, és ismeri az entitások határait – Transfer-Encoding: chunked.
2. Átvitel-kódolás (darabokban)
- A transzfer-kódolás egy HTTP fejlécmező (válaszfejléc-mező), ami szó szerint "átviteli kódolást" jelent. A legújabb HTTP specifikáció csak egy kódolási szállítási típust határoz meg: chunked.
- A chunked transfer kódolás egy adatátviteli mechanizmus a Hypertext Transfer Protocolban (HTTP), amely lehetővé teszi, hogy a webszerver által a kliensnek küldött HTTP adatokat több részre bontsa. A blokkszállítás kódolása csak a HTTP protokoll 1.1-es verziójában (HTTP/1.1) érhető el.
- Az adatokat egy sor darabokra bontják, és egy vagy több darabban küldik, hogy a szerver anélkül tudná előre a küldött tartalom teljes méretét.
Specifikus módszerek
- Miután hozzáadjuk a Transfer-Encoding: chunked a fejléchez, az azt jelenti, hogy a csomag darabolt van. Ebben az esetben a csomagban lévő entitásokat inkább egy sor darabban kell továbbítani.
- Minden darab tartalmazza a hexadecimális hosszúságértéket és az adatokat, és a hosszérték kizárólag egy sorra vonatkozik, és a hossz nem tartalmazza a CRLF-et a végén lévő CRLF-et, sem a darabolt adatok végén lévő CRLF-et.
- Az utolsó chunk hossz értéknek 0-nak kell lennie, és a megfelelő chunk adatnak nincs tartalma, ami az entitás végét jelzi.
asp.net Core tesztkód:
|