尝试将IFormFile上载到Azure时流关闭

时间:2018-10-23 15:18:15

标签: c# asp.net-core azure-storage azure-storage-blobs

我正在尝试让用户将文件上传到Azure。从基于角度的页面上传到.net core可以正常工作。它作为IFormFile传入。但是,当我尝试将IFormFile上传到Azure Blobs容器时,它将引发以下错误:

这是我的代码:

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 :(得分:0)

这里的代码似乎没有任何明显的错误。 ObjectDisposedException表示支持流的对象已被处置,在返回响应之前不应该发生这种情况,只要您正在等待异步任务,就不应发生这种情况。

鉴于这里没有很多需要工作的东西,这大部分只是猜测。我认为正在发生的事情是客户端正在取消该请求,这将导致引发TaskCancelledException。但是,由于您没有将取消令牌传递到异步任务中,因此无法监视取消任务。因此,它可能会令人窒息。如果该方法允许您传递取消令牌,则应该:

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

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