Nancy: Множество одновременных запросов

Созданный на 16 апр. 2016  ·  9Комментарии  ·  Источник: NancyFx/Nancy

Описание

Нэнси не может одновременно обслуживать много (<10) одновременных запросов.

Действия по воспроизведению

  1. Добавьте StaticContentsConventions для обслуживания файлов из каталога.
  2. Скопируйте в каталог длинный видеофайл.
  3. Откройте видео в своем браузере на многих вкладках (> 10), указав все, например, на http: //localhost/myvideo.mp4.
  4. Обратите внимание: видео отображается не на всех вкладках, вместо этого они ждут подключения, пока вы не закроете другие вкладки.

    Конфигурация системы

  • Версия Nancy: 1.4.1
  • Нэнси ведущая: OWIN
  • Браузер: Chrome

Самый полезный комментарий

Лучший вариант использовать nginx для статического контента (или другой http-сервер).

Все 9 Комментарий

Это кричит об общей проблеме с полным iis в ОС Windows, отличной от сервера, в какой версии Windows / iis вы работаете (если вообще)?

Забыл упомянуть: я использую Selfhosting с Microsoft.Owin.Host.HttpListener.
Может в этом проблема?
ОС - Windows 10.
Что было бы лучшим вариантом для самостоятельного размещения?

Лучший вариант использовать nginx для статического контента (или другой http-сервер).

Я согласен с @ Kiri-rin nginx идеально подходит для статического контента, а затем позволяет Нэнси обрабатывать вещи, связанные с api.

Что ж, проблема в том, что у меня также есть нестатический контент, который велик или требует времени для создания.
Я понимаю, что это не обычный вариант использования.
Я исследую это дальше. Было бы здорово, если бы кто-нибудь намекнул, в чем может быть проблема.

@ cody82, если у вас есть длинные маршруты, вы должны сделать их асинхронными, чтобы они не блокировали потоки запросов.

да. Значит ли это, что проблема не в общей обработке HTTP-запросов в Nancy, а в обработчике статических файлов, который неправильно использует async?

Я также столкнулся с той же проблемой в ServiceStack, который выполняет большую часть своей обработки асинхронно, но затем вызывает одну синхронную функцию Socket.Write, которая блокирует все.

Я отследил проблему в GenericFileResponse.GetFileContent:

c# private static Action<Stream> GetFileContent(string filePath, long length) { return stream => { using (var file = File.OpenRead(filePath)) { file.CopyTo(stream, (int)(length < BufferSize ? length : BufferSize)); } }; }

Таким образом, File.CopyTo блокирует поток во время передачи файла / видео.
(Также этот класс не предназначен для обработки частичных ответов, но это еще одна проблема.)
Я сомневаюсь, что это можно просто преобразовать в асинхронную функцию, но могу ли я ошибаться?

(Также этот класс не предназначен для обработки частичных ответов, но это еще одна проблема.)

@ cody82 Я создал PartialFileResponse для приложений потокового видео / аудио: https://gist.github.com/danbarua/0fd9fcad5ec85e0c02dc

Требуется небольшая очистка, но, возможно, его можно объединить с Нэнси или добавить функциональность в GenericFileResponse.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги