PartitionKey或RowKey含有“%”字符时Windows Azure Tables出错解决方案

我们发现当PartitionKey或RowKey含有“%”字符时,应用Windows Azure Tables的服务将受到影响。

受此影响的API包括:Get entity, Merge entity, Update entity, Delete entity, Insert或Merge Entity,以及Insert或Replace Entity的API。如果任何上述API被调用时其PartitionKey或RowKey含有“%”,用户则将收到404 Not Found或者400 Bad Request的错误代码。此外,当用户调用Insert或Merge Entity以及Insert或Replace的API时,请求可能成功但所储存的字符串可能并不正确。

注意Insert Entity, Entity Group Transaction以及Query Entities的API不受影响,因为PartitionKey和RowKey并不是其URL路径的一部分。

根本原因

Windows Azure Table服务处理请求时会对URL路径部分重复解码,此时会错误地理解此含有“%”的字符串。注意URL的查询字符串部分以及HTTP正文部分中的字符串并不受此影响。所以,一个查询中任何其它的属性过滤器将不受影响 – 仅PartitionKey及RowKey受影响。

以下是此问题如何发生的一个例子:插入一个实体并使PartitionKey = “Metric%25” 和RowKey = “Count”的操作将会成功。因为PartitionKey, RowKey和自定义值是请求负载的一部分而并非URL路径部分。现在,当你试图取回这个已经存在的实体之时,Get Entity HTTP URL将会如下所示:

http://foo.table.core.windows.net/Metrics(PartitionKey='Metric%2525',RowKey='Count')

然而由于二次解码的错误,PartitionKey将会在服务器端被翻译成“Metric%”,这与原值不同。在这种情况下,404 Not Found错误将会被返回。

解决方法

如果你尚未在任何实体中使用含“%”的PartitionKey或RowKey,我们建议您做如下两件事:

避免在PartitionKey和RowKey中用到“%”,或将其替换为其它字符如“-”。 考虑在PartitionKey和RowKey中应用URL 安全64位编码。

注意:请不要将重复为PartitionKey和RowKey值编码作为解决方法,以免与将来Windows Azure Tables含有服务器端修正的发布不兼容。

如果你已经插入了含有“%”的PartitionKey或RowKey的实体,我们建议如下解决方案:

对于Get Entity: 用Entity Group Transaction并使用一个内部的GET Entity命令。(详见下节示例) 在调用Query Entities API试图取回一个单一实体时依赖$Filter变量。尽管此方法不适用于Windows Azure Storage 客户端库或WCF Data Services 客户端库的用户,它适用于对传输协议有控制权的用户。举例来说,对于以上“根本原因”一节中所提到的
同一个实体可以考虑如下的查询URL语法:

http://foo.table.core.windows.net/Metrics()?$filter=(PartitionKey%20eq%20'Metric%2525')%20and%20(RowKey%20eq%20'Count')

对于Update Entity, Merge Entity, Delete Entity, Insert或Merge Entity,以及Insert或Replace Entity的API,请使用Entity Group Transaction以及你想执行的内部操作。(详见下节示例)

Windows Storage Client库的解决方案示例

假设用户已经插入了含有PartitionKey = “Metric%25” 及 RowKey = “Count”的实体。以下代码展示了如何利用Windows Azure Storage Client库以取出和更新实体。这段代码应用了前文提到的Entity Group Transaction的解决方案。请注意Get Entity和Update Entity操作都被作为批量操作执行。

// 创建表的服务上下文TableServiceContext tableServiceContext = new TableServiceContext(tableClient.BaseUri.ToString(), tableClient.Credentials); // 建立单点查询DataServiceQuery<MetricEntity> getEntityQuery = (DataServiceQuery<MetricEntity>)      from entity in tableServiceContext.CreateQuery<MetricEntity>(customersTableName)     where entity.PartitionKey == "Metric%25" && entity.RowKey == "Count"     select entity; // 建立entity group transaction并使用内部Get Entity的请求DataServiceResponse batchResponse = tableServiceContext.ExecuteBatch(getEntityQuery);            // 这是批量操作唯一的应答QueryOperationResponse response = (QueryOperationResponse) batchResponse.First(); if (response.
StatusCode == (int) HttpStatusCode.OK){    IEnumerator queryResponse = response.GetEnumerator();    queryResponse.MoveNext();    // 读取这个单独的实体    MetricEntity  singleEntity = (MetricEntity)queryResponse.Current;     // 更新实体    singleEntity.MetricValue = 100;    tableServiceContext.UpdateObject(singleEntity);        // 确定使用批量操作选项储存    tableServiceContext.SaveChanges(SaveChangesOptions.Batch);}

Java Storage Client解决方案代码示例

介于上述问题与服务有关,同样的行为也会在用Storage Client的Java库执行单实体操作时发生。然而,也可以同样应用Entity Group Transaction来解决此问题。最新版本的可以被用于实现前述解决方案的库可以在此找到here。

// 定义批量操作TableBatchOperation batchOperation = new TableBatchOperation(); // 取回实体batchOperation.retrieve("Metric%25", "Count", MetricEntity.class); // 提交一个操作到表服务tableClient.execute("foo", batchOperation);

长期修正

我们将把这个修正作为下一个版本更新的一部分进行发布。我们介时将更新此帖以反映其针对的版本信息。

我们对为您带来的不便表示深深道歉!

Jean Ghanem

时间: 2024-09-26 12:28:29

PartitionKey或RowKey含有“%”字符时Windows Azure Tables出错解决方案的相关文章

在 Visual Studio 2010 中开发和部署 Windows Azure 应用程序

原文 在 Visual Studio 2010 中开发和部署 Windows Azure 应用程序 在 Visual Studio 2010 中开发和部署 Windows Azure 应用程序 Jim Nakashima.Hani Atassi 和 Danny Thorpe 将应用程序或服务部署到 Microsoft 云服务平台 Windows Azure 的原因有很多.例如,只为使用的内容付费从而可降低操作和硬件成本.构建几乎能无限缩放的应用程序.巨大的存储容量.地理位置等等,不胜枚举. 只有

埃及世界文化遗址在Windows Azure上建立移动门户

作为真实世界 Windows http://www.aliyun.com/zixun/aggregation/13357.html">Azure 系列的一部分,在埃及通信和信息技术部(MCIT),我们联系了省开发顾问Wafaa Hassa,探索公司怎样在WindowsAzure上建立Luxor移动门户,使访问者能够在Luxor进行历史遗迹的虚拟参观和定位服务.在埃及,MCIT与公共实体一起运行,用来帮助介绍新的技术和开发新的商业模型,这可以重现整个埃及社会.在这里 读Luxor城市的成功故

Windows Azure上的Softlibrary和Kern4Cloud

Softlibrary 于1988年建于巴塞罗那(西班牙).自那时以来,它一直参与http://www.aliyun.com/zixun/aggregation/13617.html">信息管理并为我们的客户提供尖端的自定义解决方案.为达到此目的,该公司从一开始就接受微软平台和体系结构. Kern4Cloud 是一个多租户服务,专注于信息管理而不管它是否属于企业性质.它可以处理所有信息生命周期,提供发布.分类和分级.词汇-语义和词典系统.版本控制.多语种.在线翻译和工作流进程的一系列工具.

排气系统制造商Akrapovi&amp;#269; Revs运用Windows Azure进行全球运营

作为现实世界Windows Azure 系列的一部分,我联系了Akrapovič  的首席信息官AlešTancer,了解有关Windows Azure如何向该公司提供一个平台,用来支持他们的业务和全球运营的高速增长的事情.在这里读取Akrapovič的 成功故事.阅读并且了解有关他将要说些什么. Himanshu KumarSingh: 告诉我关于Akrapovič的事情. Aleš Tancer:Akrapovič 是全球领先的高质量摩托车和高性能汽车的排气系统制造商,并支持许多世界顶级摩托

Windows Azure 解决方案系列: 车辆价格提供商通过易于管理的软件+服务节省了 $100,000

Kelley Blue Book是一家高级供应商,为消费者.汽车 经销商.政府以及金融保险业提供车辆价格信息.公司利用微软.NET框架3.5开发了信息丰富的,高通信传输的网站,并以2座托管的数据中心作为支持.为了节省托管支出和简化基础设施管理, Kelley Blue Book 决定通过软件+服务模式托管和管理其网站,公司施行了Windows Azure 平台  -它提供了一个直截了当的流程.因此, Kelley Blue Book节省了新硬件的资本支出,通过关注于交付新特性来增强竞争优势,在托

backup-Azure Backup支持台式机吗? 微软有没有非利润定价Windows Azure备份?

问题描述 Azure Backup支持台式机吗? 微软有没有非利润定价Windows Azure备份? Azure Backup支持台式机吗? 微软有没有非利润定价Windows Azure备份? 解决方案 Hi, 如果你值得是Azure备份服务的话,你可以查看这个页面来了解详细的定价信息,在备份服务中存储的数据量对备份收费.将不会对带宽.存储.存储事务.计算或与提供备份服务相关联的其他资源额外向您计费.而且每个月的最初5GB是免费的,Windows Azure Backup 是简单.可靠的数据

windows-Azure能将非.net的软件移植到Windows Azure上吗

问题描述 Azure能将非.net的软件移植到Windows Azure上吗 Azure能将非.net的软件移植到Windows Azure上吗 解决方案 当然可以,因为Azure支持虚拟机,甚至可以上传你的本地vhd镜像.所以完全可以不用改动地移植现有软件. 但是,Azure还是有些限制,比如说Azure就不支持ipx协议,它也无法支持和特定硬件相关的程序(你的程序如果需要带加密狗运行,那就是悲剧)等等. 而且使用虚拟机还有一些坏处,比如说比较费钱,没法支持可用集和负载平衡,你需要自己保证服务

Windows Azure入门教学系列 (六):使用Table Storage

本文是Windows Azure入门教学的第六篇文章. 本文将会介绍如何使用Table Storage.Table Storage提供给我们一个云端的表格结构.我们可以把他想象为XML文件或者是一个轻量级的数据库(当然,不是通过SQL 语句进行数据的操作). 使用Table Storage的方法依然是调用REST API.有关Table Storage REST API的详细信息,请参见Table服务API: 为了方便.NET开发人员,我们在SDK中提供了Microsoft.WindowsAzu

在Windows Azure Web Site上为Node.js自动安装NPM包

在我以前的一个文章中,我描述和演示了如何在http://www.aliyun.com/zixun/aggregation/13375.html">Node.js和Windows Azure Web Site (WAWS)使用NPM包.在那篇文章中我使用NPM命令安装软件包,然后使用Git为Windows提交我所做的更改,并且同步它们到WAWSgit 资源库.然后WAWS将触发新的部署托管我的WAWS git 资源库应用程序. 有人可能会注意到,NPM包可能包含多个文件,而且可能有点大.例如