C #: ошибка HttpListener, обслуживающая контент - PullRequest
2 голосов
/ 01 июля 2011

Я реализовал что-то похожее на это единственная реальная разница

string filename = context.Request.RawUrl.Replace("/", "\\").Remove(0,1);
string path = Uri.UnescapeDataString(Path.Combine(_baseFolder, filename));

чтобы я мог перейти к подкаталогам. Это прекрасно работает для веб-страниц и других типов текстовых файлов, но при попытке обслужить медиа-контент я получаю исключение

HttpListenerException: ввод / вывод операция была прервана из-за выход из потока или приложение запрос

Вслед за

InvalidOperationException: Невозможно закрыть поток, пока не будут записаны все байты.

В операторе использования.

Любые предложения о том, как справиться с этим или прекратить эти исключения?

Спасибо

Ответы [ 2 ]

1 голос
/ 09 июля 2011

Я должен отметить, что я использую Google Chrome для своего браузера (Google Chrome, похоже, не заботится о типах MIME, когда он видит звук, он пытается использовать его, как в проигрывателе HTML5), но этотакже применимо, если вы пытаетесь разместить мультимедийный контент на странице.

В любом случае, я проверял свои заголовки с помощью fiddler и заметил, что Chrome передает 3 запроса на сервер.Я начал играть с другими браузерами и заметил, что они этого не делают, но в зависимости от браузера и того, что я жестко запрограммировал как тип MIME, я либо получу страницу сумасшедшего текста, либо загрузку файла.

При дальнейшей проверке я заметил, что Chrome сначала запросит файл.Затем запросите файл еще раз с несколькими разными заголовками, особенно с заголовком диапазона.Первый с байтом = 0, затем следующий с другим размером в зависимости от размера файла (в зависимости от размера файла может быть сделано более 3 запросов).

Итак, возникла проблема.Chrome сначала запросит файл.Однажды увидев тип, он отправил бы другой запрос, который, как мне кажется, ищет размер файла (byte = 0-), затем другой, запрашивающий вторую половину файла или что-то подобное, чтобы обеспечить своего рода потоковую передачу при использованииHTML5.Я быстро что-то кодировал для обработки типов MIME и бросил страницу HTML5 вместе со звуковым компонентом и обнаружил, что другие браузеры также делают это (кроме IE)

Так что вот быстрое решение, и я больше не получаю эти ошибки

string range = context.Request.Headers["Range"];
int rangeBegin = 0;
int rangeEnd = msg.Length;
if (range != null)
{
    string[] byteRange = range.Replace("bytes=", "").Split('-');
    Int32.TryParse(byteRange[0], out rangeBegin);
    if (byteRange.Length > 1 && !string.IsNullOrEmpty(byteRange[1]))
    {
       Int32.TryParse(byteRange[1], out rangeEnd);
    }
}

context.Response.ContentLength64 = rangeEnd - rangeBegin;
using (Stream s = context.Response.OutputStream)
{
    s.Write(msg, rangeBegin, rangeEnd - rangeBegin);
}
0 голосов
/ 01 июля 2011

Попробуйте:

using (Stream s = context.Response.OutputStream)
{
      s.Write(msg, 0, msg.Length);
      s.Flush()             
}
...