【问题标题】:Stream closed when trying to upload an IFormFile to Azure尝试将 IFormFile 上传到 Azure 时流已关闭
【发布时间】:2019-03-27 21:34:29
【问题描述】:

我正在尝试让用户将文件上传到 azure。从基于角度的页面上传到 .net 核心工作正常。它以 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 上传流在用户完全上传之前就已关闭。根据多个文档,这段代码应该可以正常工作......我确实通过首先将文件保存到文件系统来让它工作。但这增加了不必要的操作...

【问题讨论】:

  • 为什么不将其读入MemoryStream 并从那里上传?
  • 谢谢,MemoryStream 完美运行!

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


【解决方案1】:

您的代码似乎没有任何明显错误。但是,ObjectDisposedException 意味着支持流的对象已被释放,在返回响应之前不应发生这种情况,只要您像正在等待异步任务一样,也不应该发生这种情况。

鉴于这里没有很多工作要做,这主要只是一个猜测。我认为正在发生的是客户端取消了请求,这应该会导致TaskCancelledException 被抛出。但是,由于您没有将取消令牌传递到异步任务中,因此它无法监视任务取消。因此,它可能会窒息。如果该方法允许您传递取消令牌,您应该:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    • 2015-07-26
    • 2014-08-24
    相关资源
    最近更新 更多