Поддержание HttpHandler в живых / сброс промежуточных данных - PullRequest
0 голосов
/ 07 декабря 2011

Справочная информация: у нас возникли проблемы с одним из наших устройств GPRS, подключающихся через прокси к универсальному обработчику. Хотя обработчик закрывает соединение сразу после возврата, прокси-сервер сохраняет соединение открытым, чего устройство не ожидает.

Мой вопрос: Возможно ли для целей тестирования (чтобы имитировать поведение прокси) поддерживать соединение в течение некоторого короткого времени после того, как обработчик вернул свои данные?

Например, это не работает:

public class Ping : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        context.Response.BufferOutput = false;

        context.Response.ContentType = "text/plain";
        context.Response.WriteLine("HELLO");
        context.Response.Flush();  // <-- this doesn't send the data

        System.Threading.Thread.Sleep(10000);
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

[Изменить]

Ладно, на самом деле, все работает как положено. Проблема в том, что Firefox и Fiddler задерживают показ необработанных данных до тех пор, пока соединение не будет закрыто.

Если для Response.BufferOutput установлено значение false, и я использую терминальную программу для подключения, я немедленно получаю данные, и соединение остается открытым в течение 10 с.

Ответы [ 2 ]

1 голос
/ 07 декабря 2011

Вы можете записать в выходной поток, и это будет делать то, что вы хотите.

byte [] buffer = new byte[1<<16] // 64kb
int bytesRead = 0;
using(var file = File.Open(path))
{
   while((bytesRead = file.Read(buffer, 0, buffer.Length)) != 0)
   {
        Response.OutputStream.Write(buffer, 0, bytesRead);
         // can sleep here or whatever
   }
}
Response.Flush();
Response.Close();
Response.End();

Извлечение Лучший способ потоковой передачи файлов в ASP.NET

0 голосов
/ 07 декабря 2011

На самом деле все работает нормально:

public class Ping : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        context.Response.BufferOutput = false;

        context.Response.ContentType = "text/plain";
        context.Response.WriteLine("HELLO"); // <-- data is sent immediately

        System.Threading.Thread.Sleep(10000);
    }
}

Мне пришлось использовать терминальную программу для подключения, но потом все оказалось в порядке.

Одна вещь, которая должна бытьупоминается, что ASP добавляет заголовок Transfer-Encoding: chunked в этом случае, который изменяет способ отправки данных:

Размер каждого чанка отправляется непосредственно перед самим чанкомчто клиент может сказать, когда он закончил получать данные для этого чанка.Передача данных завершается окончательным фрагментом нулевой длины.

...