NetworkStream.DataAvailable HTTP жауабының соңын белгілемейді
Аяқталу шарты ретінде NetworkStream.DataAvailable орнына хабарлама кадрлауын қолданып, қиылып қалған HTTP жүктеулерінің алдын алыңыз.
NetworkStream.DataAvailable == false дереу оқуға дайын байт жоқ дегенді білдіреді. Бұл HTTP жауабы аяқталды дегенді білдірмейді. Сол жерде тоқтайтын цикл пакеттер арасындағы үзіліс кезінде әбден қалыпты SOCKS жүктеуін қиып тастауы мүмкін.
SOCKS TCP қосылысын орнатқаннан кейін де аяқталу ережесін HTTP кадрлауы береді:
- Content-Length денесі жарияланған мазмұн байттарынан кейін аяқталады.
- Chunked жауапқа оның қорытынды chunk-ы және тиісті trailer-лер қажет.
- Қосылыспен шектелген жауап қосылыспен бірге аяқталады.
- Кейбір мәртебелер мен HEAD-қа жауаптардың денесі болмайды.
Қолданылатын ережені анықтау үшін мәртебе мен тақырыпшаларды оқыңыз. Тек жабылуды күту әмбебап шешім емес, өйткені толық HTTP жауабы қосылысты ашық қалдыруы мүмкін. Бір буфердің сыйымдылығы да жауап ұзындығына сол дәрежеде қатыссыз.
HTTP клиентінің кадрлау іске асырылымын таңдалған прокси тасымалын қолдаса, соны пайдаланыңыз. Үйлесімді заманауи .NET орындалу ортасында HttpClient-тің жергілікті SOCKS қолдауын қарастырыңыз. Шикі іске асырылым ішінара тақырыпшалар мен дене оқулары арасында талдау күйін сақтап, сәтті аяқталуды болдырмаудан, уақыт асуынан және күтпеген EOF-тен ажыратуы керек. Бос емес оқу сұранысында нөл байт оқылуы ағынның аяқталғанын білдіреді; бұл дәл қазір кезекте байт жоқтығынан өзгеше.
Прокси уақыт үзілістерін көрнекі ете алады, бірақ бос қабылдау кезегін хабарлама соңының белгісіне айналдырмайды.