Каков жизненный цикл и / или принадлежность потока тела входящего запроса в ASP.NET Core?И как я могу продлить это? - PullRequest
0 голосов
/ 28 ноября 2018

В моем ASP.NET Core Web API клиентское программное обеспечение для настольных компьютеров будет загружать большие двоичные HTTP-запросы (потенциально гигабайты).Я хочу обработать их в фоновом режиме и вернуть ответ клиенту, если обработка не может быть завершена в течение установленного времени ожидания в несколько секунд.

В настоящее время мой код обработки читает поток запросов напрямую - что означаетцикл запроса Stream должен пережить запрос / ответ - однако мне не удалось найти какой-либо документации относительно передачи права собственности на поток запроса, чтобы предотвратить его закрытие / удаление сразу после завершения ответа контроллера.

Вот базовый пример:

class BigDataController : ControllerBase
{
    [HttpPost("data")]
    public async Task<IActionResult> ReceiveData()
    {
        Task processTask = this.ProcessDataAsync( this.Request.Body );
        Task timeoutTask = Task.Delay( 5000 );

        Task completed = await Task.WhenAny( processTask, timeoutTask );
        if( completed == timeoutTask )
        {
            return this.OK( "Still processing, please check back later..." );
        }
        else
        {
            return this.Ok( "Processing completed." );
        }
    }

    private async Task ProcessDataAsync( Stream stream )
    {
        using( StreamReader rdr = new StreamReader( stream ) )
        {
            // etc
        } 
    }
}

В случае, если ProcesDataAsync потребуется больше 5 секунд, чтобы запустить действие контроллера ReceiveData вернет ответ клиенту, и ASP.NET будетизбавиться от основного потока запроса.Я не хочу, чтобы это происходило, очевидно.

Хотя временное решение заключается в том, чтобы выполнить потоковое копирование в MemoryStream или другое постоянное хранилище, а затем обработать эти данные, у меня есть проблемыон не будет хорошо масштабироваться под запросы размером в гигабайт, которые я ожидаю получить.

Если это на самом деле фальшивка, то какие проверенные стратегии существуют для прокси или иным образом абстрагирования потока входящих запросов через постоянныйбуфер для предотвращения прерывания парой запрос / ответ моего метода ProcessDataAsync?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...