2015-07-16 3 views
2

Последние несколько дней я создавал приложение веб-сервера на C#, которое использует HttpListener. Я многому научился на пути, и все еще есть. В настоящее время я все это работаю, устанавливая заголовки здесь и там в зависимости от определенных ситуаций.Возможно ли исключение HttpListener?

В большинстве случаев все работает нормально, однако время от времени возникает ошибка исключения. Это случается несколько раз. Большинство, если не все из них закрывают соединение, прежде чем все данные будут отправлены. Затем возникает ошибка. Но некоторые из них действительно вызваны браузерами, насколько я могу судить.

Как взять Chrome. Всякий раз, когда я иду напрямую в файл MP3, он отправляет 2 запроса GET. И один из них вызывает ошибку, другой работает и получает часть содержимого. После этого я могу слушать MP3 и проблем нет. Потоковые работы. Но вернемся к запросу, который дает мне ошибку, в заголовках я ничего не могу использовать в своем коде, чтобы не выводить данные, как я уже делаю с запросами HEAD. Поэтому я очень озадачен.

У IE также есть эта проблема как с открытием файлов MP3 напрямую, так и с помощью тега HTML5. Время от времени оно также меняется. Иногда я открываю страницу и делаю только 2 запроса. HTML-страница и MP3. Ошибок нет. Иногда бывает три запроса. Он дважды подключается к MP3. Теперь иногда одно из этих подключений прерывается сразу после того, как я открываю страницу, а иногда и 2 запроса в файл MP3, даже не принимает данные. В обоих заголовках запроса они хотят завершить файл. Итак, байты: 123-123/124. Я также тестировал его на аудиоэлементе w3school. IE также делает там два подключения, один прерван, другая загрузка файла MP3.

Итак, мой вопрос в том, можно ли сделать исключение из веб-сервера исключающим/защищенным от ошибок или, может быть, лучшим вопросом, плохо ли это исключение? Или вы, возможно, знаете, как исправить эти ошибки?

Ошибка, которую я получаю: операция ввода-вывода была прервана либо выходом потока, либо запросом приложения.

Как я пишу к клиенту:

  using (Stream Output = _CResponse.OutputStream) 
      { 
       Output.Write(_FileOutput, rangeBegin, rangeLength); 
      } 

Я не уверен, если есть другой (лучше) способ. Это то, что я встречал во многих темах, учебниках и страницах во время исследования.

О заголовках: заголовки по умолчанию: длина содержимого, тип содержимого, код состояния. В некоторых случаях, таких как файлы MP3 и видео, я добавляю заголовок Accept-Ranges: Bytes. Если заголовок запроса имеет диапазон в нем, я добавляю заголовок Content-Range и код состояния PartialContent.

+0

В чем разница между этими многочисленными запросами разных браузеров? Вы использовали WireShark или подобное? –

+0

Нет, я использовал Inspect Element из браузеров, чтобы увидеть заголовки, и иногда я читал Request.Headers и записывал результаты в Console. Разница в заголовках между успешным и неудачным соединением зависит от браузеров. Chrome едва имеет какие-либо изменения в заголовке, для успешного соединения он показывает Accept: *. * и Кодирование: identity; q = 1, *; q = 0. Для неудачного соединения он использует заголовки Accept: text/html, application/xhtml + xml, application/xml; q = 0.9, image/webp, */*; q = 0.8 и Encoding: gzip, deflate, sdch. Это единственные отличия для Chrome. – Verkade89

+0

Что касается IE, то нет разницы в том, что так всегда, просто прекратите одно из двух соединений сразу. Иногда делайте 2 соединения, где он хочет 0 байт конца файла.Я уже исправил это, проверив, действительно ли rangeLength выше 0. – Verkade89

ответ

3

С точки зрения сервера любой клиент может отключиться в любое время. Это часть нормальной работы сервера. Обнаружите этот конкретный случай, запишите его и проглотите исключение (потому что оно было обработано). Это не ошибка сервера.

Смежные вопросы