检查Azure blob容器中是否存在项目需要永久(SDK 2.0)

时间:2013-05-22 00:10:14

标签: azure azure-storage-blobs

我正在升级我的c#解决方案以使用新的Azure SDK 2.0库。我已经做了一些小的更改来解释2.0库中的重大变化,但除此之外,它是相同的代码。我已经针对我的本地存储进行了测试,一切似乎都运行良好但是当我针对生产Azure blob存储进行测试时,只需检查blob项是否存在就需要花费大量时间。如果不是更多的话,它只需要一分钟就可以返回一个布尔值来指示该项是否存在。

在下面的代码示例中,需要很长时间才能完成的行是" if(!blob.Exists())"。

    public byte[] GetBlobContent(string blobName)
    {
        if (blobName == "") return null;

        var blobClient = _storageAccount.CreateCloudBlobClient();
        var container = blobClient.GetContainerReference(_containerName);
        var blob = container.GetBlockBlobReference(blobName);
        if (!blob.Exists())
        {
            return null;
        }

        byte[] buffer;
        using (var ms = new MemoryStream())
        {
            blob.DownloadToStream(ms);
            buffer = ms.ToArray();
        }

        return buffer;
    }

我需要对代码进行其他更改才能使其按以前的方式执行吗?

2 个答案:

答案 0 :(得分:0)

另一种方法是跳过Exists()检查,如果blob不存在则让DownloadToStream失败。你需要一个围绕DownloadToStream的try / catch块来处理“预期的”失败。这种方法为每个blob读取节省了一次往返存储,因为它只需要进行一次远程调用而不是两次。

答案 1 :(得分:0)

Fiddler 没有透露任何内容。我遇到了一个类似的问题,即流程无限期挂起,直到超时开始。尝试用CloudTable.CreateIfNotExists替换CloudTable.CreateIfNotExistsAsync的来电,并使用CloudTable.Execute来呼叫CloudTable.ExecuteAsync

不幸的是我无法告诉你为什么这样做。在撰写本文时,WindowsAzure.Storage-PremiumTable Nuget 程序包处于预发布模式,并且可能是错误的。