2013-05-22 24 views
4

我正在升级我的c#解决方案以使用新的Azure SDK 2.0库。我已经对2.0库中发生的重大更改进行了一些小改动,但除此之外,它们是相同的代码。我已经对本地存储进行了测试,并且一切似乎都正常,但是当我测试Azure blob存储时,只需要花费过多的时间来检查blob项是否存在。如果不是更多,只需返回一个指示该项是否存在的布尔值即可。检查项目是否存在于Azure blob容器中需要永久(SDK 2.0)

在下面的代码示例中,花费很长时间完成的行是“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; 
    } 

是否还需要对代码进行其他更改才能使其像以前一样运行?

+1

我刚刚试过你的代码,它似乎工作正常。第一次请求总是需要更长的时间(可能是一两秒钟),但从未在几分钟内,因为你正在观察。我建议从本地计算机运行此代码并通过Fiddler跟踪请求,以便您了解确切需要很长时间的问题。 –

+0

我也遇到过这个问题。通常,Exists()会在几毫秒内返回,但偶尔需要2分钟(需要或几秒钟)。这完全是烦人的! –

回答

0

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

0

提琴手没有透露任何东西。我遇到了一个类似的问题,在这个过程中无限期地挂起,直到超时启动。尝试用CloudTable.CreateIfNotExistsAsync替换的调用,并调用CloudTable.ExecuteCloudTable.ExecuteAsync

不幸的是,我不能告诉你为什么这个工程。在撰写本文时, Nuget程序包处于预发布版本模式下,并且推测是有bug的。

相关问题