我正在尝试重构我们的MVC代码,它有很多页面使用下载URL,它指向一个带有SAS的blob。能够将Url传递给控制器并使用它来定位关联的Blob会很棒。例如。有一个将Url下载作为唯一输入参数的操作。我还可以创建一个链接助手,只有在SAS公开删除等时才会显示删除链接。
如果我可以将Url传递给Azure并获得CloudBlockBlob,那将是一个很大的帮助。所以我可以删除它,更新它,获取元数据等。
我现在唯一能做的就是使用像
这样的技术 var deleteBlobRequest = BlobRequest.Delete(new Uri(fileUrl), 30, null, DeleteSnapshotsOption.IncludeSnapshots, "");
deleteBlobRequest.GetResponse().Close();
这有效,但似乎很奇怪。
我无法弄清楚从Uri获取CloudBlockBlob的代码。
有什么想法吗?我目前正在使用Azure Storage 1.7
答案 0 :(得分:4)
你不需要做任何特别的事情。如果使用SAS Uri构建blob,则存储客户端库会为您处理此问题。例如,请使用以下代码:
CloudBlockBlob cloudBlockBlob = new CloudBlockBlob("http://127.0.0.1:10000/devstoreaccount1/temp/sastest.txt?sr=b&st=2013-01-25T04%3A28%3A09Z&se=2013-01-25T05%3A28%3A09Z&sp=rwd&sig=jIWWFwZ6MXaL6FD%2F2%2FpqPl1g4f0ElFrr1fKNg5U%2FAkg%3D");
cloudBlockBlob.Delete();
这样可以正常工作。
答案 1 :(得分:1)
以下是获取SAS密钥权限的代码(假设blobUrl是带有SAS密钥的URL):
// Get permssions for current SAS key.
var queryString = HttpUtility.ParseQueryString(blobUrl);
var permissionsText = queryString["sp"];
var permissions = SharedAccessBlobPermissions.None;
if (permissionsText.Contains("w"))
permissions = permissions | SharedAccessBlobPermissions.Write;
if (permissionsText.Contains("r"))
permissions = permissions | SharedAccessBlobPermissions.Read;
if (permissionsText.Contains("d"))
permissions = permissions | SharedAccessBlobPermissions.Delete;
if (permissionsText.Contains("l"))
permissions = permissions | SharedAccessBlobPermissions.List;
这将获得基于URL 和 SAS密钥的ICloudBlob(假设blobUrl是带有SAS密钥的URL):
// Get the blob reference.
var blobUri = new Uri(blobUrl);
var path = String.Format("{0}{1}{2}{3}", blobUri.Scheme, Uri.SchemeDelimiter, blobUri.Authority, blobUri.AbsolutePath);
var blobClient = new CloudBlobClient(new Uri(path), new Microsoft.WindowsAzure.Storage.Auth.StorageCredentials(blobUri.Query));
ICloudBlob blobReference = blobClient.GetBlobReferenceFromServer(new Uri(path));