我正在将Azure存储从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
?
technical reference中没有任何关于此的内容。
是否有人使用相对URI来使用GetBlobReferenceFromServer
?有什么东西我从根本上做错了吗?
答案 0 :(得分:10)
感谢您的反馈。 GetBlobReferenceFromServer需要绝对URI,因为它是为特定场景设计的,其中用户只有一个blob的URI,并且需要让它的blob类型甚至开始使用它。
如果您知道blob的类型,我强烈建议使用GetContainerReference,然后使用GetBlockBlobReference或GetPageBlobReference,因为这些方法不必调用Azure存储服务来获取blob类型。因此,它们可以降低成本并提高性能。它们也直接与blob名称一起工作,而不是URI。