Вызов асинхронного действия в asp.net ядро означает, что файл в FormData потерян из метода c # API

#asp.net-core #asynchronous #file-upload #form-data

#asp.net-core #асинхронный #загрузка файла #форма-данные

Вопрос:

Я могу прочитать файл из form-data и сохранить его, как ожидалось. Однако, когда я выполняю асинхронное действие, поток закрывается, и файла больше нет. Удаление асинхронного действия означает, что оно снова работает. Мне нужно выполнить асинхронный запрос, чтобы сохранить файл в правильном месте.

     [Route("uploadFile")]
    [AllowAnonymous]
    public  async void uploadFile()
    {
        var files = HttpContext.Request.Form.Files;

        if (files != null)
        {
            var file = files.FirstOrDefault();
            var fileName = file.FileName; 

            using (var input = file.OpenReadStream())
            {
                  var id = "someId";
                  await Task.Delay(TimeSpan.FromSeconds(2));
                  // after doing this async action, the file and stream are no longer accessible. 
                  ...
  

Комментарии:

1. файл или поток? похоже, это не связано с DynamoDB как таковым, но, скорее всего, проблема с поддержкой async в asp.net ядро: что-то, что можно попробовать — вместо выполнения запроса DynamoDB, попробуйте это: await Task.Delay(TimeSpan.FromSeconds(2)) и посмотрите, вызывает ли это ту же проблему, и в этом случае вы можете, по крайней мере, сосредоточить свои усилия направильное направление

2. как файл, так и поток. Файл становится нулевым, и поток закрывается. Какая отличная идея! Я попробовал это и подтвердил, что вы правы, проблема связана с поддержкой асинхронности в asp.net ядро. Спасибо, я обновлю вопрос

Ответ №1:

Я опубликовал это как вопрос к asp.net основная команда и получила ответ здесь.

Не используйте async void в вашем действии контроллера. Вместо этого используйте асинхронную задачу, чтобы платформа могла подождать, пока вы не закончите.

Я не ожидал, что возвращаемый тип повлияет на эту функциональность, но теперь я знаю.