Как сбросить поток ответов HttpListener?

HttpListener дает вам поток ответов, но вызов flush ничего не значит (и из источников это ясно, потому что на самом деле он ничего не делает). Копание внутри HTTP API показывает, что это ограничение самого HttpListener.

Кто-нибудь точно знает, как сбросить поток ответов HttpListener (может быть, с отражением или дополнительными P/Invokes)?

Обновление: вы не можете ничего транслировать по http, если у вас нет опции сброса или возможности определить размер буфера.


person Mash    schedule 27.04.2009    source источник


Ответы (2)


Flush работает только в большей части пространства имен System.Net, когда для параметра Transfer-Encoding установлено значение Chunked, в противном случае возвращается весь запрос, и Flush на самом деле ничего не делает. По крайней мере, это то, что я испытал, работая с HttpWebResponse.

person Nick Berardi    schedule 27.04.2009
comment
Вопрос не в том, ПОЧЕМУ это не работает... Но представьте себе потоковую передачу по http, где важно отправить что-то как можно скорее. Разрозненные данные здесь вообще не вариант. HttpListener фактически отправляет что-то ДО того, как вы закончите запрос, но использует довольно большой ненастраиваемый буфер. - person Mash; 27.04.2009
comment
И кстати, ASP.NET нормально очищается, когда вы спрашиваете об этом... ASP.NET требует некоторых хаков для получения содержимого InputStream до того, как будет получено полное тело POST, но OutputStream работает нормально. - person Mash; 27.04.2009
comment
HTTP на самом деле не является потоковым протоколом. Он предназначен для передачи текста через Интернет, отсюда и название протокола передачи гипертекста. Если вы хотите потоковую передачу, я бы предложил сокет. Или что-то лучше для потоковой передачи контента в достаточно небольших пакетах, чтобы вы могли контролировать. - person Nick Berardi; 27.04.2009
comment
Спасибо, Ник, но вы будете удивлены, узнав, что большая часть потокового трафика сегодня использует HTTP. HTTP — это не что иное, как просто HTTP-заголовок перед бинарным TCP-потоком... Вопрос только в управляемых инструментах для создания сервера. HttpListener — самый быстрый управляемый вариант для серверов на основе TCP, но MS забыла добавить в него ручную очистку. - person Mash; 27.04.2009
comment
Есть ли причина, по которой вы привязаны к HttpListener? Разве переписчик URL-адресов с прокси-сервером не сделает то же самое? coderjournal.com/2009 /04/ - person Nick Berardi; 28.04.2009

Я еще не пробовал, но как насчет того, чтобы написать отдельный TCP-сервер для потоковой передачи ответов? Затем перенаправьте запрос от HttpListener на «внутренний» tcp-сервер. Используя это перенаправление, вы можете передавать данные обратно по мере необходимости.

Что касается его очистки, я вижу, что единственный способ сделать это - имитировать удаление без фактического удаления. Если вы можете взломать объект HttpResponseStream, сказать ему удалить, снять флаг m_Closed и т. д., возможно, вы сможете сбросить потоковые данные.

person Erich Mirabal    schedule 27.04.2009
comment
Написание отдельного TCP-сервера? Лучше просто написать все с помощью TcpListener (который быстрее, чем .NET Sockets), но гораздо медленнее, чем HttpListener. Я проверю источники утилизации, но имхо это неправильный путь. Сбрасывать или нет в http.sys определяется самим пакетом данных. - person Mash; 27.04.2009