Поток закрывается при попытке загрузить IFormFile в Azure - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь позволить пользователю загрузить файл в Azure.Загрузка с угловых страниц в ядро ​​.net работает нормально.Это приходит как IFormFile.Но когда я пытаюсь загрузить IFormFile в контейнер BLOB-объектов Azure, он выдает следующую ошибку:

image

Вот мой код:

Sheet data = JsonConvert.DeserializeObject<Sheet>(Request.Form["data"]);
IFormFile formFile = Request.Form.Files[0];
data.DateAdded = DateTime.Now.ToString();

if (formFile.FileName.EndsWith(".pdf"))
{
    if (formFile.Length > 0)
    {
        //db.Sheets.Add(data);
        //db.SaveChanges();

        string path = data.StoreLocation.ProjectName;

        CloudBlockBlob blockBlob = container.GetBlockBlobReference(path);
        await blockBlob.UploadFromStreamAsync(formFile.OpenReadStream());
    }
}

Я думаю,Поток загрузки IFormFile закрывается до того, как пользователь загрузил его полностью.Согласно нескольким документам, этот код должен работать просто отлично ... Сначала я запустил его, сохранив файл в файловой системе.Но это добавляет ненужные действия ...

1 Ответ

0 голосов
/ 23 октября 2018

Похоже, что с вашим кодом здесь что-то не так.Однако ObjectDisposedException подразумевает, что объект, поддерживающий поток, был удален, что не должно происходить до тех пор, пока ответ не будет возвращен, что также не должно происходить, пока вы ожидаете асинхронную задачу, как вы делаете.

Учитывая, что здесь не над чем работать, это всего лишь предположение.Я думаю, что происходит то, что запрос отменяется клиентом, что должно вызвать выброс TaskCancelledException.Однако, поскольку вы не передаете токен отмены в свою асинхронную задачу, он не может отслеживать отмену задачи.Поэтому, скорее всего, он задыхается.Если метод позволяет вам передать токен отмены, вы должны:

public async Task<IActionResult> Foo(..., CancellationToken cancellationToken = default)
{
    ...

    await blockBlob.UploadFromStreamAsync(formFile.OpenReadStream(), cancellationToken);
}
...