如果我有一个随机网址,我该如何检查它是否指向Azure中的blob?如果它指向Azure Blob,我可以确定此blob存在并且我可以访问它 我尝试了以下方法:
我使用Exists进行了一些测试,但这并不令人满意:
new CloudBlockBlob(new Uri("http://example.com"))
ArgumentException: Invalid blob address 'http://example.com/', missing container information
new CloudBlockBlob(new Uri("https://example.com/fdh/3746C9A2-533E-4544-A10B-321A8BC40AEA/sample-file.txt")).Exists()
false
new CloudBlockBlob(new Uri("http://stackoverflow.com/questions/43109843/ways-to-migrate-documents-pdf-forms-from-ms-sharepoint-to-aem")).Exists()
StorageException: Blob type of the blob reference doesn't match blob type of the blob.
因此,基本上创建CloudBlockBlob
可能会失败,Exists
可能会失败或返回false
。
但这样做是错误的。
我可以将网址检查为https://<storage-account>.blob.core.windows.net/<container>/*
,但我不确定这是否始终正确。
如果我能保证2.工作,我会这样做,因为不需要HTTP请求。
是否有其他(更好)的方法来检查随机URL是否指向Azure中的blob(可能是(Azure Storage SDK)框中的某些内容)?
答案 0 :(得分:2)
不是一个优雅的解决方案(阅读,基本上是黑客攻击:D)
您可以做的一件事是向网址发出HEAD
请求。您需要做的是解析响应头。您需要考虑3种情况:
现在,对Azure Blob存储的每个请求都会有一个名为x-ms-request-id
的响应标头,其中包含GUID之类的值。您可以使用它来区分URL指向blob存储且URL不指向blob存储的方案。当然这个检查会失败(这就是为什么解决方案更像是&#34; hack&#34;如果URL实际返回此标题[某个随机网站决定在响应中包含这个确切的标题])。
如果是#1,您将获得状态代码200。由于blob可公开访问,因此您将获得其他标头。其中一个标题为x-ms-blob-type
,可能有3个值:BlockBlob
,AppendBlob
或PageBlob
。
如果是#2,您将获得状态代码404,但是您将收到x-ms-request-id
响应标题。