0

我有一些代码可以使用 REST API 从 Windows Azure 的表中添加和删除实体。如果我添加一个带有 PartitionKey 'abcd' 和 RowKey 'efgh' 的实体,然后删除它,它就可以正常工作。删除操作的相对 URL 是

devstoreaccount1/TableX(PartitionKey='abcd',RowKey='efgh')

这用于创建身份验证标头,因此签名字符串的规范化资源是

/devstoreaccount1/devstoreaccount1/TableX(PartitionKey='abcd',RowKey='efgh')

一切都很好,一切都很好。接下来,我插入另一个实体,其分区键为“abc d”,rowKey 为“efg h”(即添加了空格)。实体插入正常。当我尝试删除它时,我创建了带有空格的 uri,并且我的请求得到了错误代码 403 的响应。基本上该请求没有经过身份验证。解决此问题的下一步是通过调用 HttpUtility.PathEncodeUrl(partitionKey) 来更改值,rowKey 也是如此。所以规范化的资源现在是

/devstoreaccount1/devstoreaccount1/TableX(PartitionKey='a%20b%20c%20d',RowKey='e%20f%20g%20h')

当我提出这样的请求时,我收到错误代码 404(未找到)的响应。这意味着,很明显,身份验证已经通过,但似乎在内部调用处理程序在搜索实体键时忘记将 %20 转换回空格。

好的,经过这么长的描述,我的两个问题是:1)对空格进行编码以便通过身份验证并找到要删除的实体的正确方法是什么?2)如果参数之一包含单引号,那么在字符串中对其进行编码的正确方法是什么。

我更喜欢使用 REST API,所以请不要告诉我使用 TableServiceContext 类。

在此先感谢您的帮助。最后一点:MSDN (http://msdn.microsoft.com/en-us/library/windowsazure/dd135727.aspx) 中关于此主题的文档不正确。它表明参数应该用双引号而不是单引号发送。如果您这样做,则响应为 403(禁止访问)。我花了一段时间才弄明白。

4

1 回答 1

0

谢谢你的建议,smarx。像往常一样,“问题越简单,就越难解决”。我需要打电话

fullPathUri = HttpUtility.UrlPathEncode(fullPathUri);

对于创建 HttpWebRequest 时使用的参数,然后一切正常。至于单引号,需要用 2 个单引号替换(例如 from who's there to who's there

于 2012-04-07T14:34:45.730 回答