Azure表存储异常信息

时间:2011-11-15 05:29:26

标签: azure fiddler azure-table-storage

查找调试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不玩游戏?

4 个答案:

答案 0 :(得分:5)

通常,如果您尝试使用服务不支持的操作,则会收到无效输入错误消息。请记住,服务中没有完整的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。很明显,我正在进行的比较是期待一个字符串,并被比作整数。我当然简化了实际查询,但我的观点仍然存在。我一直使用这个工具来建模我的查询并检查实际发生的事情。

答案 1 :(得分:4)

如果将“ipv4.fiddler”添加到hosts文件中,它将解析为localhost previous 以命中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,并跟踪与dev存储模拟器之间的所有HTTP流量。

答案 2 :(得分:0)

我刚收到这个错误,想把我的2美分投入,希望能在几分钟内拯救别人......我的POCO中有一个可以为空的Guid,到目前为止,没有一个记录已经填满了这个值等我打电话的时候:

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

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

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

答案 3 :(得分:0)

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

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

用法:

尝试

{

//向Azure表存储(Blob,表,队列,...)发出请求

}

catch(StorageException storageException)

{

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

INT? httpStatusCode = storageException.GetHttpStatusCode();

// GetFailedOperationIndex扩展方法为您提供Azure表批处理操作中失败操作的索引

int failedOperationIndex = storageException.GetFailedOperationIndex();

}