我一直在关注this example,用于将大型文件从MVC Web应用程序上传到Azure blob存储中 .
在该示例中,第一个控制器操作创建blob引用并在Session中存储一些元数据:
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*);
显而易见,这是为了方便本教程,但对我来说应该如何完成并不明显 . 对于可扩展的 Cloud 应用程序,我根本不想使用会话 .
我的问题是,在每个块上传中简单地提交和重写blob存储是否完全没问题,如果没有,是否有适合Azure应用程序的缓存替代方案?
如果它影响答案,我想从javascript调用WebAPI控制器,所以无论如何都没有会话 .
1 回答
你有几个选择 . 第一种方法是继续使用Session对象和change the Session Provider(见下文) . 第二个是write your own layer that would handle caching给你像Redis这样的东西 . 无论哪种情况,currently recommended caching solution都是Redis .
对于第一个选项,有几个Session Providers available:
在内存会话状态提供程序中 - Defualt但正如您所提到的那样不能很好地扩展
Sql Server会话状态提供程序 - 这会对性能产生影响,因为它会往返于SQL数据库 .
分布式内存会话状态提供程序,例如Redis缓存会话状态提供程序 - This is the currently recommended solution for using the Session State .
使用Redis会话状态提供程序
您可以继续使用Session对象并在Web.Config中切换会话提供程序以使用Redis而不是内存 . 首先添加RedisSessionStateProvider Package from NuGet然后更新web.config:
caching guidance in Azure的caching guidance in Azure上的这篇文章有关于这两种情况的大量信息 .