【问题标题】:Streaming Data from Azure Blobs Back to Client将 Azure Blob 中的数据流式传输回客户端
【发布时间】:2016-03-03 12:08:51
【问题描述】:

使用 ASP.Net Web API,我正在开发一项服务,该服务(除其他外)从 Azure 检索数据,并将其返回给客户端。

这样做的一种方法是将 netire blob 读入缓冲区,然后将该缓冲区写入响应。但是,我宁愿流式传输内容,以获得更好的性能。

使用 Azure API 很简单:

CloudBlobContainer container = BlobClient.GetContainerReference(containerName);
        CloudBlockBlob blob = container.GetBlockBlobReference(blobName);
        using (var buffer = new MemoryStream())
        {
            await blob.DownloadToStreamAsync(buffer);
}

在代码的其他地方,这会返回给客户端:

HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK);
response.Content = new StreamContent(buffer);

但是我可以确定在客户端完成读取之前 MemoryStream 不会被关闭/处置吗?

【问题讨论】:

  • 要考虑的一种替代方法是将内容从 blob 直接下载到浏览器,并完全绕过您的 VM(减少 VM 负载)。我发布了一个关于 here 的答案。

标签: c# azure stream blob asp.net-web-api


【解决方案1】:

只要您不将内存流包装在“使用”语句中就可以了。如果你确实使用了“使用”,你最终会遇到一个奇怪的竞争条件,它有时会起作用,有时会失败。 我在生产中有类似你的代码,它运行良好。

唯一需要注意的是,在将任何内容发送到客户端之前,整个 blob 都会被复制到内存中。这可能会导致服务器内存压力和初始延迟,具体取决于文件的大小。 如果这是一个问题,您有几个选择。 一种是在 blob 上创建一个“租约”,并为用户提供一个 URL,以便在有限的时间内直接从 blob 存储中读取它。不过,这只适用于低安全性场景。

或者,您可以使用分块传输编码。基本上,您从块存储中读取文件并以这些块的形式将其发送到客户端。这可以节省内存——但我无法让它异步工作,所以你正在用内存换线程。哪种解决方案适合您,取决于您的具体情况。

(我手头没有代码,如果你想要它发表评论,我会尝试挖掘它,即使它有点旧)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 2020-06-21
    • 2018-07-01
    • 2015-11-29
    • 2018-07-15
    相关资源
    最近更新 更多