使用相对URI无法使用GetBlobReferenceFromServer方法。错误:"只允许绝对地址"。

7

我正在将Azure Storage从1.7 SDK升级到2.3 SDK,并且一直在更新我的GetBlobReference(string)调用为GetBlockReferenceFromServer(Uri)

过去我一直在使用相对URI,但是当我将这些传递到GetBlockReferenceFromServer时,我会收到一个错误,提示我不能使用绝对URI(请参见下面的堆栈)

示例代码:

Dim myAccount As CloudStorageAccount = CloudStorageAccount.Parse(connectionString)
Dim myClient As CloudBlobClient = myAccount.CreateCloudBlobClient()
Dim myRelativeUri As New Uri("mycontainer/myblob.txt", UriKind.Relative)
Dim myBlobref As ICloudBlob = myClient.GetBlobReferenceFromServer(myRelativeUri) <- Errors on this line

错误堆栈:

System.ArgumentException: Address 'mycontainer/myblob.txt' is a relative address. Only absolute addresses are permitted.Parameter name: uri   
at Microsoft.WindowsAzure.Storage.StorageUri.AssertAbsoluteUri(Uri uri)   
at Microsoft.WindowsAzure.Storage.StorageUri.set_PrimaryUri(Uri value)   
at Microsoft.WindowsAzure.Storage.StorageUri..ctor(Uri primaryUri, Uri secondaryUri)   
at Microsoft.WindowsAzure.Storage.StorageUri..ctor(Uri primaryUri)   
at Microsoft.WindowsAzure.Storage.Blob.CloudBlobClient.GetBlobReferenceFromServer(Uri blobUri, AccessCondition accessCondition, BlobRequestOptions options, OperationContext operationContext)   at MySoftware.MyReference...

我不明白为什么在 CloudBlobClient 有一个 BaseUri 的情况下,Uri 必须是绝对的。在尝试获取引用之前,我是否需要手动添加 BaseUri
技术参考文档中没有关于这方面的内容。
是否有人成功使用相对 URI 并使用GetBlobReferenceFromServer?我是否基本上做错了些什么?

1
在存储客户端库1.7和2.0之间(发布时的版本号),有许多重大变化。似乎这是其中之一。我试图查找2.0版本的发行说明(https://github.com/Azure/azure-storage-net/blob/master/changelog.txt),但不幸的是,它只从2.0.1开始。我想你只能假设这是一个重大变化,并且需要提供绝对URI。 - Gaurav Mantri
1个回答

11

感谢您的反馈。 GetBlobReferenceFromServer需要绝对URI,因为它是为特定场景设计的,即用户只有一个指向blob的URI,甚至需要获取其blob类型才能开始使用。

如果您知道blob的类型,我强烈建议使用GetContainerReference,然后使用GetBlockBlobReference或GetPageBlobReference,因为这些方法不必调用Azure Storage服务来获取blob类型。因此,它们将减少开销并提高性能。它们还可以直接处理blob名称,而不是URI。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接