Ответ HttpListener сбрасывается в ближайшее время для «больших» буферов - PullRequest
3 голосов
/ 08 марта 2011

У меня есть служба, работающая с использованием Topshelf, которая запрашивает данные проприетарной системы CRM. Этот сервис предоставляет интерфейс REST для этой системы CRM. Все отлично работает, и я получаю ответы в формате JSON.

У меня есть конкретный запрос, который возвращает JSON-ответ размером почти 500 КБ. Это хорошо работает для компьютеров в локальной интрасети, но при соединении с VPN соединение немного медленнее, и внезапно ответ частично получен, а после обновления я получаю оставшуюся часть.

Есть ли способ убедиться, что полный буфер отправляется клиенту?

Я использую следующий код:

byte[] buffer = System.Text.Encoding.UTF8.GetBytes(data);            
context.Response.ContentEncoding = System.Text.Encoding.UTF8;
context.Response.ContentLength64 = buffer.Length;
context.Response.Headers.Add("Content-Type", contentType);
context.Response.OutputStream.Write(buffer, 0, buffer.Length);
context.Response.OutputStream.Close();

1 Ответ

0 голосов
/ 03 октября 2013

Первое, что я вижу здесь, это то, что вы на самом деле не вызывали context.Response.Close, что вам нужно сделать.Закрытие ответа закроет поток, но закрытие потока не задокументировано (насколько я могу найти), чтобы закрыть ответ.Закрытие ответа также закроет объект запроса, который также не закрывается здесь.

Возможно, это решит проблему.Я могу представить, что в вашем тесте VPN были другие различия, кроме скорости сети;тест VPN мог быть выполнен из браузеров или через прокси-серверы, которые поддерживали только HTTP 1.0, что означает, что они ожидают, что соединение будет закрыто (или это может быть HTTP 1.1, но отправка соединения: закрыть в заголовке), прежде чем они будут думатьони получили весь ответ.Вызов Close в выходном потоке, вероятно, не закроет сокет, но вызов close для самого ответа сделает, и это может в конечном итоге решить вашу проблему.

Надеюсь, это будет полезно для всех, кто читает в будущем.

Гарольд

...