我正在升级我的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;
}
我需要对代码进行其他更改才能使其按以前的方式执行吗?
答案 0 :(得分:0)
另一种方法是跳过Exists()检查,如果blob不存在则让DownloadToStream失败。你需要一个围绕DownloadToStream的try / catch块来处理“预期的”失败。这种方法为每个blob读取节省了一次往返存储,因为它只需要进行一次远程调用而不是两次。
答案 1 :(得分:0)
Fiddler 没有透露任何内容。我遇到了一个类似的问题,即流程无限期挂起,直到超时开始。尝试用CloudTable.CreateIfNotExists
替换CloudTable.CreateIfNotExistsAsync
的来电,并使用CloudTable.Execute
来呼叫CloudTable.ExecuteAsync
。
不幸的是我无法告诉你为什么这样做。在撰写本文时,WindowsAzure.Storage-PremiumTable
Nuget 程序包处于预发布模式,并且可能是错误的。