【问题标题】:Azure Table Storage Exception InformationAzure 表存储异常信息
【发布时间】:2011-11-15 05:29:26
【问题描述】:

发现调试 Azure 表存储非常令人沮丧。在我了解各种限制之前,至少很难用 InvalidInput 的代码来找出信息量惊人的 DataServiceQueryException 的原因。

在网上搜索了很多之后,http://blogs.msdn.com/b/partlycloudy/archive/2009/12/16/development-storage-logging.aspx 的帖子显示了如何打开日志记录。这会在错误日志文件中填充更多非常有用的信息。永久保留此日志记录可能不是一个好主意,并且每次遇到问题时都检查此文件不是理想的情况。

有很多关于使用 Fiddler 查看实际请求和响应的帖子,但我无法使其正常工作。我已将连接字符串配置为通过 Fiddler 代理进行连接(我必须手动将 ipv4.fiddler 主机名添加到 hosts 文件中,否则无法解析 - Fiddler 应该自动执行此操作)。我可以看到部署连接,但看不到任何查询的连接。我尝试以管理员身份运行 Fiddler,但仍然得到相同的结果。

为什么这么难?我错过了什么吗?是否有一个选项可以返回记录在错误日志文件中的异常信息,而不是垃圾 InvalidInput 异常消息?知道 Fiddler 不玩游戏的原因吗?

【问题讨论】:

  • 您是否已更新到最新的 Azure 工具(2011 年 11 月:microsoft.com/windowsazure/sdk)? -- 显然异常消息在此版本中得到了改进。
  • 谢谢!他们肯定得到了改进。还有一些没有太大帮助,但总体上更好。

标签: azure fiddler azure-table-storage


【解决方案1】:

通常,如果您尝试使用服务不支持的操作,您将收到无效输入错误消息。请记住,整套 LINQ 操作(排序、最小值、最大值等)在服务中不可用(尽管它们可以在本地计算)。对此进行故障排除的第一步应该是查看您正在尝试的实际操作。如果您使用的不是 .Select() 或 .Where(),则很有可能它目前不受支持。

编辑:我一写这个,就遇到了类似的错误。由于我已经知道支持哪些操作,所以我想向您展示我用来解决问题的代码:

void Main()
{
    var acct = CloudStorageAccount.DevelopmentStorageAccount;

    var client = acct.CreateCloudTableClient();
    var ctx = client.GetDataServiceContext();
    ctx.IgnoreMissingProperties = true;

    var table = "tl36f6e92d94954f168ade0be6a547c0ce";

    //build query
    var q = ctx.CreateQuery<Foo>(table)
        .Where(e => e.RowKey.CompareTo(2) < 0) //this query fails
        .Take(10);

    //Dump URI to inspect
    ((DataServiceQuery)q).RequestUri.Dump();

    //dump results
    q.Dump();
}


[System.Data.Services.Common.DataServiceKey("PartitionKey", "RowKey")]
class Foo
{
    public string PartitionKey { get; set; }
    public string RowKey { get; set; }
    public string Whatever { get; set; }
}

我将它放入 LINQPad(有史以来最强大的工具)中,然后查看了 URI。很明显,我进行的比较需要一个字符串,并且被比较为一个整数。我当然简化了实际查询,但我的观点是成立的。我一直使用这个工具首先对我的查询进行建模并检查实际发生的情况。

【讨论】:

    【解决方案2】:

    如果您将“ipv4.fiddler”添加到您的主机文件中,它将解析为本地主机之前点击 Fiddler,因此忽略代理设置,因为它是本地地址。答案不是向主机添加“ipv4.fiddler”。有一个解决您遇到的 DNS 解析问题的方法...

    当您启动 Fiddler 时,它会将登录用户的 WinINET 代理设置为 127.0.0.1:8888。但是,Dev Fabric 将 IIS 应用程序池设置为作为 NETWORK SERVICE 运行,因此它不知道 Fiddler 的 WinINET 代理配置,因此不会通过 Fiddler 路由 HTTP 请求。因此,在使用 Azure 存储连接字符串时出现 DNS 解析失败:"UseDevelopmentStorage=true;DevelopmentStorageProxyUri=http://ipv4.fiddler"

    所以尝试从 VS 命令提示符运行它:

    bitsadmin /util /SETIEPROXY NETWORKSERVICE MANUAL_PROXY 127.0.0.1:8888 NULL

    这样 NETWORK SERVICE 现在使用 Fiddler 作为代理,将 ipv4.fiddler 解析为 localhost,并跟踪所有进出开发存储模拟器的 HTTP 流量。

    【讨论】:

    • 这可以使用“bitsadmin /util /SETIEPROXY NETWORKSERVICE NO_PROXY”来恢复。
    • FWIW,Fiddler 将登录用户的 WinINET 代理设置为 127.0.0.1:8888,所以我只是将我的应用程序池设置为从我的本地帐户运行,并使用连接通过 Fiddler 路由存储流量上面提到的字符串。
    【解决方案3】:

    我刚刚收到此错误,想投入 2 美分,希望能节省其他人几分钟...我的 POCO 中有一个可为空的 Guid,到目前为止,没有任何记录填充该值所以当我打电话时:

    _repository.Find(f => f.PartitionKey == request.CompanyPartitionKey() && f.MyNullGuid == null);
    

    这引发了同样的错误,因为直到一个实例通过一个不可为空的值出现之前,表存储根本没有放入这个列......所以我没有做任何事情得到“无效输入” ,但是因为 Table Storage 从未将我的可为空列放入,直到有记录保证这样做。

    修复:我将 null guid 更改为非 null 并将我的检查更改为 Guid.Empty...呃...

    【讨论】:

      【解决方案4】:

      我为 Azure StorageException 编写了一个扩展类,它提取了 Azure 存储服务嵌入其中的所有有用信息(表、Blob、队列……)

      https://www.nuget.org/packages/AzureStorageExceptionParser/

      用法:

      试试

      {

      //向 Azure 表存储(Blob、Table、Queue、..)发出请求

      }

      捕获(StorageException storageException)

      {

      //GetHttpStatusCode 扩展方法为您提供嵌入在 StorageException 中的 HttpStatusCode

      int? httpStatusCode = storageException.GetHttpStatusCode();

      // GetFailedOperationIndex 扩展方法为您提供 Azure Table Batch 操作中失败操作的索引

      int failedOperationIndex = storageException.GetFailedOperationIndex();

      }

      【讨论】:

        猜你喜欢
        • 2011-09-30
        • 2016-12-05
        • 1970-01-01
        • 1970-01-01
        • 2018-07-31
        • 2012-01-26
        • 2015-12-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多