今天这篇文章用来阐述如何在Windows Azure的平台上管理应用程序文件权限,如你所知,在Azure平台上运行的程序不建议将用户的文件放在一台Server上面,因为Azure平台通常是多个实例同时运行的,而用户是不知道自己是在访问那一个instance(由load balancer自动分配)相互之间如果需要访问这些Server上的文件,必须通过internal endpoint来访问这些文件,通常你还需要对这些文件进行同步,即一个instance上面的用户文件更新了,你必须还要将这个更新分配给所有instance。
所以我们建议把数据放在Azure的Storage里面(也可以是SQL Azure),利用云存储来解决在多个instance之间数据共享的问题,而这将会带来一些问题,例如我们需要对某些数据进行保护而不是让所有人都能访问到,你可能会想到通过设置BlobContainer的权限来做到这一点,但是似乎为每个用户去申请一个Container似乎不是非常好,因为每个BlobContainer可以容纳100T的数据,比较浪费。所以这里我们通过这个示例来做到这一点,这里将会按照文件路径的形式来处理Blob文件,同时利用HttpModulerr来处理访问的文件。
[本示例完整源码下载]
具体下载目录在 /2012年资料/7月/27日/在Windows Azure平台上管理文件/
先决条件:
下载Azure SDK 1.6,并且保证已经安装了SQL Server express版本。
名称为CSAzureServeFilesFromBlobStorage, 并且选择建立一个Web Role。这里我们同样会使用Table Storage来管理Blob文件,如果我们需要查询功能,只需要访问这个Table便可以得到Blob的一些信息:
创建一个class library来处理Table Storage:
FileEntity 实体类:
public class FileEntity : TableServiceEntity { /// <summary> /// No parameters constructor /// </summary> public FileEntity() { PartitionKey = "all"; RowKey = string.Format("{0:10}-{1}", DateTime.MaxValue.Ticks - DateTime.Now.Ticks, Guid.NewGuid()).Replace("-", ""); } /// <summary> /// With parameters constructor /// </summary> /// <param name="partitionKey"></param> public FileEntity(string partitionKey) { PartitionKey = partitionKey; RowKey = string.Format("{0:10}-{1}", DateTime.MaxValue.Ticks - DateTime.Now.Ticks, Guid.NewGuid()).Replace("-", ""); } public string FileName { get; set; } public string FileUrl { get; set; } }