Azure BlobClient返回非可查找流,改用OpenRead是否有明显弊端?
问题:Azure Blob存储文件下载接口的代码改动是否存在明显弊端?
原实现代码
我原本通过以下端点提供文件下载服务:
[HttpGet("Files/{id}")] [HttpHead("Files/{id}")] public IActionResult GetFile(Guid id) { var blob = Container.GetBlobClient(id.ToString().ToLower()); // Container是BlobContainerClient实例 var download = blob.Download(); return File(download.Value.Content, "mime-type", "file name", enableRangeProcessing: true); }
存在的问题
download.Value.Content是一个非可查找流,这导致Azure返回的响应缺少content-length或accept-ranges标头。大文件下载时,浏览器无法获取文件大小,也就无法显示下载进度百分比。
修改后的代码
我打算把代码改成这样:
[HttpGet("Files/{id}")] [HttpHead("Files/{id}")] public IActionResult GetFile(Guid id) { var blob = Container.GetBlobClient(id.ToString().ToLower()); var stream = blob.OpenRead(new BlobOpenReadOptions(allowModifications: false)); return File(stream, "mime-type", "file name", enableRangeProcessing: true); }
修改后返回的是可查找流,能生成正确的响应标头,解决了进度显示的问题。
其他尝试的异常情况
我还试过blob.DownloadStreaming和blob.DownloadTo方法,本地测试正常,但部署到Azure后会抛出如下异常:
Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
核心疑问
我使用的是Azure.Storage.Blobs, Version=12.14.1.0版本,想知道:
- 上述改用
OpenRead的改动是否存在明显弊端? - 为什么
Download()方法会返回非可查找流?
内容的提问来源于stack exchange,提问作者Brad
相关产品推荐
相关产品推荐

