我一直在关注this example用于将大文件从 MVC Web 应用程序上传到 Azure blob 存储 block 。
在示例中,第一个 Controller 操作创建一个 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*);
很明显,这是为了教程中的方便而这样做的,但对我来说并不明显应该如何完成。对于可扩展的云应用程序,我根本不想使用 session 。
我的问题是,在每个 block 上传时简单地提交并重写到 blob 存储是否完全可以?如果不是,是否有适合 Azure 应用程序的缓存替代方案?
如果它影响答案,我想从 javascript 调用 WebAPI Controller ,所以无论如何都没有 session 。
最佳答案
您有几个选择。第一个是继续使用 Session 对象和 change the Session Provider (请参阅下面的更多内容)。第二个是 write your own layer that would handle caching为您提供诸如 Redis 之类的东西。 currently recommended caching solution无论哪种情况都是 Redis .
对于第一个选项,有几个 Session Providers available :
- 内存 session 状态提供程序 - 默认,但正如您提到的,扩展性不佳
- Sql Server session 状态提供程序 - 这会对性能产生影响,因为它会往返 SQL 数据库。
- 分布式内存 session 状态提供程序,例如 Redis 缓存 session 状态提供程序 - 这是当前推荐的使用 session 状态的解决方案。
使用 Redis session 状态提供程序
您可以继续使用Session对象并在Web.Config中切换Session Provider以使用Redis而不是内存中。首先添加RedisSessionStateProvider Package from NuGet然后更新 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>
这篇文章关于caching guidance in Azure由Microsoft Patterns and Practices Team有关于这两种情况的大量信息。
关于c# - Azure blob 存储 - 分块文件上传 - 跨回发缓存数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22944928/