【发布时间】:2020-02-04 22:56:39
【问题描述】:
我正在为从 Azure Blob 存储下载文件创建包装器。 我有一个简单的文件模型
public class File
{
public Stream Data { get; set; }
public string Name { get; set; }
public string Path { get; set; }
public long Size { get; set; }
}
我下载文件的方法如下所示
private async Task<File> GetFile(string name, string path = null)
{
var blockBlob = _container.GetBlockBlobReference(GetKey(name, path));
await blockBlob.FetchAttributesAsync();
var memoryStream = new MemoryStream();
await blockBlob.DownloadToStreamAsync(memoryStream).ConfigureAwait(false);
memoryStream.Position = 0;
return new File(
name: name,
path: path: blockBlob.Uri.ToString(),
data: memoryStream,
size: blockBlob.Properties.Length);
}
问题:我可以创建一个 memoryStream 并且从不丢弃它吗?我应该将 memoryStream 作为参数传递并将生命周期的责任转移给调用者吗?如果是,我怎么能用 mu 模型做到这一点?
【问题讨论】:
-
不建议让调用者负责管理流(实际上在您的实现中,您应该将 memorystream 的使用包装在 using 语句中) - 为什么不将 data 属性设置为 block /文本而不是流(取决于您实际存储的内容)?
-
什么意思?如果它应该在调用方使用,我如何包装 memorystream 以使用,否则它将在 GetFile 方法中处理。
-
内存流是在非静态方法中创建的,因此它在执行堆栈上创建,并在您退出方法时自动释放。堆栈被弹出,因此所有数据都被销毁。
-
你的意思是设计一切都很好?
-
@jdweng 你是对的 - 不需要使用 MemoryStream(请参阅docs.microsoft.com/en-us/dotnet/api/… 中的注释)。所以我猜代码是可以的
标签: c# asp.net-web-api azure-blob-storage