azure - 更新到 Storage 2.1.0.3 后在 MVC 中返回 Blob 流时出现 NullReferenceException

标签 azure azure-storage

我的 MVC Controller 中有多个操作,它们通过将 blob 流传递到 FileResult 来返回 Azure blob。像这样:

    public FileResult DownloadReport(string Id)
    {
        // Look up model
        string fileName = messenger.ReportTitle(Id);

        // Get a reference to the blob
        CloudBlockBlob mainReportBlob = cloudBlobContainer.GetBlockBlobReference(Id);

        // Return as a FileResult
        using (var reportReader = mainReportBlob.OpenRead())
        {
            return File(reportReader , "application/pdf", fileName );
        }
    }

我最近将 Azure 存储库更新到最新版本并开始收到以下异常:

System.NullReferenceException was unhandled by user code
HResult=-2147467261
Message=Object reference not set to an instance of an object.
Source=Microsoft.WindowsAzure.Storage
StackTrace:
at Microsoft.WindowsAzure.Storage.Blob.BlobReadStreamBase.ConsumeBuffer(Byte[] buffer, Int32 offset, Int32 count) in e:\projects\azure-sdk-for-net\microsoft-azure-api\Services\Storage\Lib\Common\Blob\BlobReadStreamBase.cs:line 222
at Microsoft.WindowsAzure.Storage.Blob.BlobReadStream.Read(Byte[] buffer, Int32 offset, Int32 count) in e:\projects\azure-sdk-for-net\microsoft-azure-api\Services\Storage\Lib\DotNetCommon\Blob\BlobReadStream.cs:line 72
at System.Web.Mvc.FileStreamResult.WriteFile(HttpResponseBase response)
at System.Web.Mvc.FileResult.ExecuteResult(ControllerContext context)
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult)
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult)<br/> at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult)

该错误似乎来自 Azure 库本身。有什么想法吗?

最佳答案

因此,在使用反编译器单步调试之后,我发现 BlobReadStreamBase.Dispose() 方法在读取之前就被调用了。进一步挖掘,似乎从 Controller 返回 File() 实际上并没有读取流,而只是将其传递给 MVC 的其余部分来处理它。

这意味着我的 using() block 在 MVC 可以沿着管道进一步读取它之前关闭了 Blob 流。我将我的操作更改为:

    public FileResult DownloadReport(string Id)
    {
        // Look up model
        string fileName = messenger.ReportTitle(Id);

        // Get a reference to the blob
        CloudBlockBlob mainReportBlob = cloudBlobContainer.GetBlockBlobReference(Id);

        // Return as a FileResult, DON'T place in a using() block or it will be closed early
        var reportReader = mainReportBlob.OpenRead();
        return File(reportReader , "application/pdf", fileName );
    }

这有效。此外,我在反编译器中设置了一个断点,稍后会调用 BlobReadStreamBase.Dispose(),因此推测 MVC 正在进一步清理管道中的内容。

我不知道为什么这之前会起作用,因为它不应该起作用。也许是 Azure 库中修复的错误?

关于azure - 更新到 Storage 2.1.0.3 后在 MVC 中返回 Blob 流时出现 NullReferenceException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19844150/

相关文章:

git - Github 操作中的 git remote add 权限被拒绝

c# - 使用 C# 在多级文件夹结构中查找 Azure 存储容器中的 Blob

visual-studio - 在哪里下载我的 Azure SQL 项目的发布配置文件?

azure 驱动器存储和映射驱动器

azure - Azure 存储表中每个读/写事务的最大行数是多少

azure - 从表存储中删除旧的 Windows Azure 诊断数据(性能计数器等)

azure - 自定义域在使用 Azure CDN 时出现错误 400

c# - 操作未在分配的超时 00 :01:00 内完成

azure - 检测 SQL Azure 是否受到限制

azure - 如何在两个不同数据中心托管的两个 Azure 存储(blob)之间进行同步