1

我正在尝试重构我们的 MVC 代码,它有很多页面使用下载 url,这些 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 存储 1.7

4

2 回答 2

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();

这会很好用。

于 2013-01-25T04:33:27.070 回答
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;

这将获得一个基于带有SAS 键的 URL 的 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));
于 2013-01-24T23:46:15.447 回答