如果我有一个随机 URL,我将如何检查它是否指向 Azure 中的一个 blob?如果它指向一个 Azure Blob,我可以确定这个 Blob 存在并且我可以访问它。
我尝试了以下方法:
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)框之外的东西)?
最佳答案
不是一个真正优雅的解决方案(阅读,它基本上是一个黑客:D)
您可以做的一件事是向 URL 发出 HEAD
请求。您需要做的是解析响应 header 。您需要考虑 3 种情况:
现在,对 Azure Blob 存储的每个请求都有一个名为
x-ms-request-id
的响应 header ,其中包含一个类似 GUID 的值。您可以使用它来区分 URL 指向 Blob 存储和 URL 不指向 Blob 存储的情况。当然,此检查将失败(这就是为什么如果 URL 实际返回此 header [某些随机站点决定在响应中包含此确切 header ],则解决方案更像是“黑客”的原因)。在第 1 种情况下,您将返回状态代码 200。由于 blob 是可公开访问的,因此您将获得额外的 header 。头文件之一是
x-ms-blob-type
,它可能有 3 个值: BlockBlob
、 AppendBlob
或 PageBlob
。在第 2 种情况下,您将返回状态代码 404,但是您将收到
x-ms-request-id
响应 header 。关于c# - 检查 URL 是否指向 Azure Blob,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43110294/