1. Предистория:
- Постоянни проблеми с връзката: При непостоянни връзки браузърът може да определи границите на искащия или отговорния обект според това дали връзката е прекъсната; При непрекъснати връзки този подход очевидно не работи. Понякога, въпреки че съм изпратил всички данни, браузърът не знае дали ще има нови данни на отворената връзка, затова просто чака.
- Решете с дължина на съдържанието: Изчислете дължината на обекта и кажете на другата страна през главата. Браузърът може да разбере, че обектът за отговор е над по дължината на Content-Length
- Нов проблем с дължината на съдържанието: Тъй като полето Content-Length трябва наистина да отразява дължината на обекта, дължината е неизвестна за динамично генерирано съдържание, докато съдържанието не бъде създадено. В този момент, за да получите точна дължина, можете само да отворите достатъчно голям буфер и да изчакате цялото съдържание да бъде генерирано, преди да изчислите. Въпреки това, това изисква повече разходи за памет от една страна, а от друга страна ще накара клиента да чака по-дълго.
- Нуждаем се от нов механизъм, който не разчита на дължината на заглавката и познава границите на обектите - Transfer-Encoding: chunked.
2. Трансферно кодиране (на части)
- Transfer-Encoding е HTTP заглавно поле (response header), което буквално означава "трансферно кодиране". Последната HTTP спецификация дефинира само един тип кодиращ транспорт: chunked.
- Кодирането на парчета е механизъм за трансфер на данни в протокола за хипертекстов трансфер (HTTP), който позволява HTTP данните, изпратени от уеб сървър към клиента, да бъдат разделени на няколко части. Кодирането на блоков транспорт е налично само в HTTP протокол версия 1.1 (HTTP/1.1).
- Данните се разбиват на серия от части и се изпращат в един или повече части, така че сървърът да може да изпраща данни, без да знае предварително общия размер на изпратеното съдържание.
Специфични методи
- След добавяне на Transfer-Encoding: chunked към заглавката, това означава, че пакетът е на части. В този случай обектите в пакета трябва да се предават в серия от чънци.
- Всеки фрагмент съдържа стойността на шестнадесетичната дължина и данните, като стойността на дължината е изключителна за един ред, като дължината не включва CRLF в края му, нито CRLF в края на фрагментираните данни.
- Последната стойност на дължината на частта трябва да е 0, а съответните данни за чънк нямат съдържание, което показва края на обекта.
asp.net Основен тестов код:
|