将Azure Blob中的数据流回客户端

时间:2015-11-29 22:08:07

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

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

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

Azure API很简单:

session

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

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

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

1 个答案:

答案 0 :(得分:2)

只要你没有将你的记忆流包装在“使用”语句中,你就可以了。如果你确实使用“使用”,你最终会遇到一种奇怪的竞争条件,有时它会起作用而在其他时候会失败。 我在生产中有像你的代码,它工作正常。

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

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

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