为什么Azure表存储操作会无声地失败?

时间:2013-02-07 11:35:35

标签: c# azure azure-table-storage

我有一个使用Microsoft.WindowsAzure.StorageClient v1.7构建的辅助角色。在我的开发机器和我的计算模拟器上,应用程序正常工作。但是,当我部署到Azure时,表存储操作无提示失败。代码如下 - BackupResult类继承自TableServiceEntity

Trace.WriteLine("Entering cloud storage method");
CloudTableClient client = storageAccount.CreateCloudTableClient();
Trace.WriteLine("Got the client..."); // Last message received.
client.CreateTableIfNotExist("LastRun");
Trace.WriteLine("Created the table (maybe)...");
TableServiceContext context = client.GetDataServiceContext();
Trace.WriteLine("Got the context...");
BackupResult lastResult = context.CreateQuery<BackupResult>("LastRun").ToList().OrderByDescending(x => x.RunTime).FirstOrDefault();
Trace.WriteLine("Returning the last result. It ran at: " + lastResult.ToString());
return lastResult;

根本没有抛出异常,但是我没有在标记的消息下面看到任何跟踪日志,并且我的应用程序的逻辑不会在此方法之外进行。我的本地配置与我的云配置相同。什么可能导致这种行为?

2 个答案:

答案 0 :(得分:1)

我的通灵调试能力告诉我它并没有失败 - 它只是花了很长时间。 .ToList()调用将尝试检索表中的每个实体。您的dev存储表可能没有太多行(几千?),而生产还有很多。所以它需要更长的时间。我想你也会试图将所有这些实体都粘在内存中,如果你开始使用页面文件,这可能会导致速度减慢。

您可以通过向查询添加Take(1000)来测试此假设。显然,这不会给你正确的答案,你只是想看看它是否完成。我的v1.7技能有点生疏,但我认为它看起来像这样:

BackupResult lastResult = context.CreateQuery<BackupResult>("LastRun")
.Take(1000) //BEFORE the .ToList() - very important!
.ToList() 
.OrderByDescending(x => x.RunTime) 
.FirstOrDefault(); 

如果有限查询确实成功完成,那么实际的解决方案是弄清楚如何快速执行该查询。您需要在查询中添加一些条件,以减少从表存储返回的结果的大小,或者可能以不同的方式索引数据(例如,将RunTime合并到RowKey中)。

答案 1 :(得分:0)

您可能需要注意的一些事项:

  1. 诊断连接字符串指向云配置文件中的云存储帐户。
  2. 确保云存储中的表(LastRun)包含一些数据。
  3. 你可以做的一件事(或者你可能已经做过)是让在模拟器中运行的应用程序实际上是使用云存储帐户而不是存储模拟器。