查找调试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不玩游戏?
答案 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();
}