Я пытаюсь передать большой файл в веб-формах из HttpHandler. Кажется, это не работает, потому что это не потоковая передача файла. Вместо этого он читает файл в память, а затем отправляет его обратно клиенту. Я ищу решение повсюду, и решение сообщает мне, что они транслируют файл, когда делают то же самое. Мое решение этого потока таково:
using (Stream fileStream = File.OpenRead(path))
{
context.Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(360.0));
context.Response.Cache.SetCacheability(HttpCacheability.Public);
context.Response.AppendHeader("Content-Type", "video/mp4");
context.Response.AppendHeader("content-length", file.Length);
byte[] buffer = new byte[1024];
while (true)
{
if (context.Response.IsClientConnected)
{
int bytesRead = fileStream.Read(buffer, 0, buffer.Length);
if (bytesRead == 0) break;
context.Response.OutputStream.Write(buffer, 0, bytesRead);
context.Response.Flush();
}
else
{
break;
}
}
context.Response.End();
}
Что происходит с небольшими файлами, если я отлаживаю код, он будет воспроизводить видео, но не до тех пор, пока не достигнет строки context.Respond.End (). Но для больших файлов это не сработает, потому что при сохранении всего файла в памяти возникнут проблемы.
IHttpAsyncHandler
и чтение с диска асинхронно. - person vcsjones   schedule 31.05.2013