【问题标题】:Check if URL points to Azure Blob检查 URL 是否指向 Azure Blob
【发布时间】:2017-03-30 15:00:54
【问题描述】:

如果我有一个随机 URL,我将如何检查它是否指向 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. 我可以检查 url 是否为 https://<storage-account>.blob.core.windows.net/<container>/*,但我不确定这是否总是正确的。

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

是否有其他(更好的)方法来检查随机 URL 是否指向 Azure 中的 blob(可能是(Azure 存储 SDK)框之外的东西)?

【问题讨论】:

  • 可以选择网络请求吗?
  • 是的,当然,任何请求都可以,只要它能完成工作。
  • 如果它是私有容器和/或您没有指定正确的凭据,它也可能会失败
  • 好的,如果我有一个指向 Azure Blob 的 URL,我可以确定它存在 并且我可以访问它(更新后的帖子)。

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


【解决方案1】:

不是一个真正优雅的解决方案(阅读,基本上是一个 hack :D)

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

  1. URL 指向 Blob 存储中的 Blob,可公开访问。
  2. URL 指向 Blob 存储中的 Blob,但不可公开访问(容器是私有的)。
  3. URL 未指向 Blob 存储。

现在,对 Azure Blob 存储的每个请求都会有一个名为 x-ms-request-id 的响应标头,其中包含类似 GUID 的值。您可以使用它来区分 URL 指向 Blob 存储和 URL 不指向 Blob 存储的方案。当然,此检查将失败(这就是为什么如果 URL 实际返回此标头[某些随机站点决定在响应中包含此确切标头],则解决方案更像是“黑客”的原因)。

在第 1 种情况下,您将返回状态码 200。因为 blob 是可公开访问的,所以您将获得额外的标头。其中一个标题是x-ms-blob-type,它可能有3个值:BlockBlobAppendBlobPageBlob

在第 2 种情况下,您将返回状态代码 404,但您将收到 x-ms-request-id 响应标头返回。

【讨论】:

  • 没错,这是一个 hack :-),但无论如何都是一个有趣的。谢谢。
  • 我在去年左右使用了这种方法,效果很好。请注意,您也可能会收到 401 未授权
  • @yonisha 我认为对于 blob 存储,您永远不会得到 401 状态码。你能解释一下在什么情况下你会得到 401 吗?
  • @GauravMantri,对不起,我的意思是 403。当使用无效的 SAS 令牌时,Azure 将返回“403 服务器无法对请求进行身份验证。确保授权标头的值正确形成,包括签名”。创建具有有效 SAS 的 blob url 并更改 SAS 将导致此错误
  • @yonisha...是的,403 错误肯定会出现在多种情况下。但即使在这种情况下,您也会得到 x-ms-request-id 标头。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-05
  • 2011-02-08
  • 2012-06-17
  • 1970-01-01
  • 2011-06-07
相关资源
最近更新 更多