C# API - 提供从 Azure Blobstorage 下载文件

问题描述 投票:0回答:1

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

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

[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 再次下载它?

c# .net azure azure-blob-storage
1个回答
0
投票

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

我按照本指南设置了我的架构,它运行得完美无缺。感谢沉默最初的想法。

© www.soinside.com 2019 - 2024. All rights reserved.