检查URL是否指向Azure Blob

时间:2017-03-30 06:37:18

标签: c# azure azure-storage azure-storage-blobs

如果我有一个随机网址,我该如何检查它是否指向Azure中的blob?如果它指向Azure Blob,我可以确定此blob存在并且我可以访问它 我尝试了以下方法:

  1. 我使用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

    但这样做是错误的。

  2. 我可以将网址检查为https://<storage-account>.blob.core.windows.net/<container>/*,但我不确定这是否始终正确。

  3. 如果我能保证2.工作,我会这样做,因为不需要HTTP请求。

    是否有其他(更好)的方法来检查随机URL是否指向Azure中的blob(可能是(Azure Storage SDK)框中的某些内容)?

1 个答案:

答案 0 :(得分:2)

不是一个优雅的解决方案(阅读,基本上是黑客攻击:D)

您可以做的一件事是向网址发出HEAD请求。您需要做的是解析响应头。您需要考虑3种情况:

  1. URL指向blob存储中的blob,可以公开访问。
  2. URL指向blob存储中的blob但不可公开访问(容器是私有的)。
  3. URL未指向blob存储。
  4. 现在,对A​​zure Blob存储的每个请求都会有一个名为x-ms-request-id的响应标头,其中包含GUID之类的值。您可以使用它来区分URL指向blob存储且URL不指向blob存储的方案。当然这个检查会失败(这就是为什么解决方案更像是&#34; hack&#34;如果URL实际返回此标题[某个随机网站决定在响应中包含这个确切的标题])。

    如果是#1,您将获得状态代码200。由于blob可公开访问,因此您将获得其他标头。其中一个标题为x-ms-blob-type,可能有3个值:BlockBlobAppendBlobPageBlob

    如果是#2,您将获得状态代码404,但是您将收到x-ms-request-id响应标题。