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

标签 c# azure asp.net-web-api azure-blob-storage azure-caching

我一直在关注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 AzureMicrosoft Patterns and Practices Team有关于这两种情况的大量信息。

关于c# - Azure blob 存储 - 分块文件上传 - 跨回发缓存数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22944928/

相关文章:

c# - 如何使用字符串获取 Properties.Settings.Default?

c# - 使用 LINQ 检查 List<string> 是否包含另一个 List<string> 中的元素

c# - 在 Windows 中,如何使用 C++ 或 C# 在属于另一个进程的窗口中获取突出显示的文本?

azure - 如何检测 Windows Azure 中的恶意事件 - 查看 Azure 实例上传入的 HTTP 请求的方法?

python - Azure ML 实验运行失败并显示 'HttpLoggingPolicy' 没有属性 'DEFAULT_HEADERS_ALLOWLIST'

javascript - Webapi 导出到 excel 下载的损坏文件

c# - 从 .c#.net 中的一堆复选框中选择复选框

c# - 从 Azure 机器人调用 Web API

asp.net-mvc - ASP.NET Web API - Windows 窗体应用程序中的身份验证

asp.net-mvc - 创建单个 Controller 以返回数据和 View