通过已知密钥从Azure表存储获取100个项目结果HTTP错误414
本文关键字:项目 100个 获取 结果 HTTP 错误 存储 密钥 Azure | 更新日期: 2023-09-27 18:26:01
我想显示Azure表中的100个项目,我已经知道PartitionKey和Rowkey,所以对于$filter,它看起来像这样:
((PartitionKey eq 'js32') and (RowKey eq '18371378441826619420')) or ((PartitionKey eq 'js53') and (RowKey eq '18371389407961060290')) or ((PartitionKey eq 'js37') and (RowKey eq '18371565010300884950')) or ((PartitionKey eq 'js64') and (RowKey eq '18371570522532718663')) or ((PartitionKey eq 'js78') and (RowKey eq '18371571234060779934')) or ((PartitionKey eq 'js18') and (RowKey eq '18371620015195251645')) or ((PartitionKey eq 'js59') and (RowKey eq '18371642621740783008')) or ((PartitionKey eq 'js27') and (RowKey eq '18371653219702884172')) or ((PartitionKey eq 'js79') and (RowKey eq '18371686842261536342')) or ((PartitionKey eq 'js25') and (RowKey eq '18371703202567992223')) or ((PartitionKey eq 'js25') and (RowKey eq '18371721921192859595')) or ((PartitionKey eq 'js40') and (RowKey eq '18371723165056625088')) or ((PartitionKey eq 'js58') and (RowKey eq '18371742515754080322')) or ((PartitionKey eq 'js59') and (RowKey eq '18371742690277511383')) or ((PartitionKey eq 'js27') and (RowKey eq '18371754349415311569')) or ((PartitionKey eq 'js41') and (RowKey eq '18371755036440371353')) or ((PartitionKey eq 'js70') and (RowKey eq '18371790002968340255'))......
Total 100 items (so 100 PartitionKey and 100 RowKey)
但后来我得到了错误:HTTP Error 414. The request URL is too long.
你经历过这个错误吗?你是如何解决的?
HTTP响应414并非特定于Windows Azure表存储:它只是意味着您的请求URI太长。我从来没有遇到过这种情况,因为我通常不会在以这种方式调用多个单独行的情况下构建查询。我不确定最大URI长度是多少。
话虽如此:这个查询看起来不会很高效,因为你正在跨越分区,这意味着你将使用延续令牌返回部分结果(至少这是我基于你提供的$filter片段的猜测)。有关延续令牌和响应的更多信息,请点击此处。
我同意David Makogon的观点——最好编写多个查询。如果你这样做,你也可以使用并行线程来加快速度。如果你走这条路,在你的分区键上分组(每个线程/连接都会命中一个特定的键/一组键)。
就长URI而言,IE将支持大约2k。我不知道这是否是IE特定的限制,或者这个限制是否也适用于.NETWebClient。此外,请注意,即使它使用很长的查询字符串,也可能存在无法使用该长度的Uri的代理。
另一个建议是转换为范围查询(大于和小于),并使用额外的查询片段排除某些不需要的元素。只有当键结构使得范围查询有意义时,这才有效。
Erick
您是通过REST还是StorageClientLibrary实现这一点的?这个库确实为您提供了一些不错的抽象。