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控制器,所以无论如何都没有会话。

Azure blob存储-分块文件上传-跨回发缓存数据

您有几个选项。第一种方法是继续使用会话对象并更改会话提供程序(请参阅下面的详细信息)。第二种方法是编写自己的层,为您处理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中缓存指南的文章提供了大量关于这两种场景的信息。