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

本文关键字:悄无声息 失败 操作 Azure 存储 为什么 | 更新日期: 2023-09-27 17:58:03

我使用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;

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

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

我的心理调试能力告诉我,它并没有失败——只是花了很长时间。.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. 诊断连接字符串指向云配置文件中的云存储帐户
  2. 请确保云存储中的表(LastRun)包含一些数据

你可以做的一件事(或者可能你已经做了)是让应用程序在模拟器中运行,实际上是使用云存储帐户而不是存储模拟器。