C# API - 提供从 Azure Blob 存储下载的文件

Posted

技术标签:

【中文标题】C# API - 提供从 Azure Blob 存储下载的文件【英文标题】:C# API - Provide download of files from Azure Blobstorage 【发布时间】:2021-12-05 09:50:53 【问题描述】:

我目前正在解决我在使用 Azure Blob 存储C# API 时遇到的问题。我在这里的问题中也没有找到合适的解决方案,因为他们中的大多数只下载一次文件就完成了。

我想要实现的是拥有一个 API 作为代理来处理我的移动客户端的文件下载。因此,我需要快速响应/快速首字节响应,因为移动应用程序的超时时间相当短,仅为 5 秒。

    [HttpGet, Route("id")]
    [Authorize(Policy = xxxxx)]
    public async Task<FileStreamResult> Get(Guid tenantId, Guid id)
    
        if (tenantId == default)
        
            throw new ArgumentException($"Tenant id 'tenantId' is not valid.");
        

        if (id == default)
        
            throw new ArgumentException($"Package id 'id' is not valid.");
        

        var assetPackage = await _assetPackageService.ReadPackage(myenum.myvalue, tenantId, id).ConfigureAwait(false);
        if (assetPackage == null)
        
            return File(new MemoryStream(), "application/octet-stream");
        
        return File(assetPackage.FileStream, assetPackage.ContentType);
    
        public async Task<AssetPackage> ReadPackage(AssetPackageContent packageContent, Guid tenantId, Guid packageId)
        
            var blobRepository = await _blobRepositoryFactory.CreateAsync(_settings, tenantId.ToString())
                .ConfigureAwait(false);

            var blobPath = string.Empty;

            //some missing irrelevant code

            var blobReference = await blobRepository.ReadBlobReference(blobPath).ConfigureAwait(false);

            if (blobReference == null)
            
                return null;
            

            var stream = new MemoryStream();
            await blobReference.DownloadToStreamAsync(stream).ConfigureAwait(false);
            stream.Seek(0, SeekOrigin.Begin);
            return new AssetPackage(packageContent, stream, blobReference.Properties.ContentType);
        

我知道 MemoryStream 对于下载和东西来说很糟糕,因为它会在将文件分发给客户端之前将文件消耗到内存中。

你会如何解决这个问题?有没有简单的解决方案让我的 API 充当代理,而不是下载整个文件然后让客户端从我的 api 再次下载?

【问题讨论】:

非常不同的想法:如果您只想提供下载代理:在 blob 存储前使用 Azure API 管理(例如在消费层)。无需繁重的 ASP API 哦该死的。我可以试试。谢谢你。我会回来的。 您可以(而且我认为应该)使用从 APIM 到 Blob 存储的 AAD 身份验证 是的,我们的 APIM 已经设置好了,我基本上应该可以添加它了。 【参考方案1】:

可能且有效的解决方案是 - 正如silent 提到的 - 将 Azure 存储添加到 Azure API 管理。您可以添加授权或使用可能适合或不适合您的应用程序的 SAS 链接。

我按照this guide 设置了我的架构,它完美无缺。感谢沉默的最初想法。

【讨论】:

以上是关于C# API - 提供从 Azure Blob 存储下载的文件的主要内容,如果未能解决你的问题,请参考以下文章

将文件从 Azure 文件共享复制到 Azure Blob 的 C# 代码

如何使用 C# 中的 Azure.Storage.Blobs 从 Azure 存储 Blob 以 ByteArray 格式获取文件

使用 C# 从 Azure Blob 复制到 AWS S3

如何使用 c# 从 azure blob 存储中检索 xml 文件

C#:使用 Azure.Storage.Blobs 客户端库将 blob 从一个容器移动到另一个容器

如何通过 API 调用从 azure 容器中获取 blob 数据?