Azure blob存储-分块文件上传-跨回发缓存数据
本文关键字:数据 缓存 存储 blob -分 文件 Azure | 更新日期: 2023-09-27 17:57:38
我一直在遵循这个示例,以块的形式将大型文件从MVC web应用程序上传到Azure blob存储。
在该示例中,第一个控制器操作创建一个blob引用,并在会话中存储一些元数据:
var fileToUpload = new CloudFile()
{
BlockCount = blocksCount,
FileName = fileName,
Size = fileSize,
BlockBlob = container.GetBlockBlobReference(fileName),
StartTime = DateTime.Now,
IsUploadCompleted = false,
UploadStatusMessage = string.Empty
};
Session.Add("CurrentFile", fileToUpload);
允许每个连续的呼叫从中断的地方恢复:
CloudFile model = (CloudFile)Session["CurrentFile"];
model.BlockBlob.PutBlock(*new chunk stream*);
很明显,在教程中这样做是为了方便,但我不清楚应该如何做。对于一个可伸缩的云应用程序,我根本不想使用会话。
我的问题是,在每次上传区块时,简单地提交并重写到blob存储是否完全可以?如果不是,是否有适合Azure应用程序的缓存替代方案?
如果它影响了答案,我想从javascript调用WebAPI控制器,所以无论如何都没有会话。
您有几个选项。第一种方法是继续使用会话对象并更改会话提供程序(请参阅下面的详细信息)。第二种方法是编写自己的层,为您处理Redis之类的缓存。目前推荐的缓存解决方案是Redis。
对于第一个选项,有几个会话提供程序可用:
- 内存会话状态提供程序-默认,但正如您所提到的,扩展性不好
- Sql Server会话状态提供程序-这会对性能产生影响,因为它会往返于Sql数据库
- 分布式内存中会话状态提供程序,如Redis Cache会话状态提供器-这是当前推荐的使用会话状态的解决方案
使用Redis会话状态提供程序
您可以继续使用Session对象,并将Web.Config中的Session Provider切换为使用Redis,而不是在内存中。首先从NuGet添加RedisSessionStateProvider包,然后更新web.config:
<sessionStatemode="Custom" customProvider="MySessionStateStore">
<providers>
<!--Remove old session state info if currently configured.-->
<add name="MySessionStateStore" type="Microsoft.Web.Redis.RedisSessionStateProvider" host="<redis host url/ip here>" accessKey="<your access key here>" />
</providers>
这篇由微软模式和实践团队撰写的关于Azure中缓存指南的文章提供了大量关于这两种场景的信息。