1. Передумови:
- Постійні проблеми з підключенням: Для непостійних з'єднань браузер може визначати межі сутності, що запитує або відповідає, залежно від того, чи не працює з'єднання; Для безперервних з'єднань цей підхід, очевидно, не працює. Іноді, навіть якщо я вже надіслав усі дані, браузер не знає, чи будуть нові дані на відкритому з'єднанні, тому просто чекає.
- Розв'язуйте за довжиною контенту: обчисліть довжину сутності і скажіть іншій стороні через голову. Браузер може визначити, що сутність відповіді знаходиться над за інформацією про довжину Content-Length
- Нова проблема з довжиною змісту: оскільки поле довжини змісту має дійсно відображати довжину сутності, довжина для динамічно згенерованого контенту невідома до створення контенту. На даний момент, щоб точно визначити довжину, можна відкрити достатньо великий буфер і дочекатися, поки буде згенеровано весь контент, перш ніж обчислювати. Однак це вимагає більше витрат на пам'ять, з одного боку, а з іншого — змушує клієнта чекати довше.
- Нам потрібен новий механізм, який не залежить від довжини заголовка і знає межі сутностей — Transfer-Encoding: chunked.
2. Кодування передачі (на частини)
- Transfer-Encoding — це поле заголовка HTTP (поле заголовка відповіді), що буквально означає «кодування передачі». Остання специфікація HTTP визначає лише один тип транспорту кодування: chunked.
- Кодування передачі на шматки — це механізм передачі даних у протоколі передачі гіпертексту (HTTP), який дозволяє розділяти HTTP-дані, надсилені веб-сервером клієнту, на кілька частин. Кодування блочного транспорту доступне лише у версії протоколу HTTP 1.1 (HTTP/1.1).
- Дані розбиваються на серію чанків і надсилаються одним або кількома блоками, щоб сервер міг надсилати дані без знання загального розміру надісланого контенту заздалегідь.
Специфічні методи
- Після додавання Transfer-Encoding: chunked до заголовка означає, що пакет є фрагментованим. У цьому випадку сутності пакета потрібно передавати серією чанків.
- Кожна частина містить шістнадцяткове значення довжини та дані, і це значення є виключним для одного рядка, і довжина не включає CRLF у кінці і CRLF у кінці фрагментованих даних.
- Останнє значення довжини блоку має дорівнювати 0, і відповідні дані блоку не мають вмісту, що вказує на кінець сутності.
asp.net Основний тестовий код:
|