C# API - 提供从 Azure Blob 存储下载文件
C# API - Provide download of files from Azure Blobstorage
我目前正在处理 使用 Azure Blob Storage 和 C# 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 再次下载它?
可行且有效的解决方案是 - 如 silent 所述 - 将 Azure 存储添加到 Azure API 管理。您可以添加授权或使用可能适合或不适合您的应用程序的 SAS 链接。
我按照 this guide 设置了我的体系结构并且它运行完美。感谢 silent 的初衷。
我目前正在处理 使用 Azure Blob Storage 和 C# 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 再次下载它?
可行且有效的解决方案是 - 如 silent 所述 - 将 Azure 存储添加到 Azure API 管理。您可以添加授权或使用可能适合或不适合您的应用程序的 SAS 链接。
我按照 this guide 设置了我的体系结构并且它运行完美。感谢 silent 的初衷。