В моем 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
?