RESTAPIを使用してWindowsAzureのテーブルにエンティティを追加および削除するコードがいくつかあります。PartitionKey'abcd'とRowKey'efgh'を使用してエンティティを追加してから削除すると、正常に機能します。削除操作の相対URLは次のとおりです。
devstoreaccount1/TableX(PartitionKey='abcd',RowKey='efgh')
これは認証ヘッダーの作成に使用されるため、署名文字列の正規化されたリソースは次のようになります。
/devstoreaccount1/devstoreaccount1/TableX(PartitionKey='abcd',RowKey='efgh')
すべてが素晴らしく、すべてが正常に機能します。次に、パーティションキー'abcd'とrowKey'efg h'(つまり、スペースを追加)を持つ別のエンティティを挿入します。エンティティは正常に挿入されます。削除しようとすると、スペースを使用してURIを作成し、リクエストはエラーコード403の応答を受け取ります。基本的に、リクエストは認証されませんでした。この問題を解決するための次のステップは、HttpUtility.PathEncodeUrl(partitionKey)を呼び出して値を変更し、rowKeyについても同じことを行うことです。つまり、正規化されたリソースは
/devstoreaccount1/devstoreaccount1/TableX(PartitionKey='a%20b%20c%20d',RowKey='e%20f%20g%20h')
このようにリクエストすると、エラーコード404(見つかりません)の応答が返されます。これは、明らかに認証が行われたことを意味しますが、エンティティキーを検索するときに、内部的にコールハンドラが%20をスペースに戻すのを忘れたようです。
さて、この長い説明の後、私の2つの質問は次のとおりです。1)認証を通過し、エンティティが削除対象として検出されるようにスペースをエンコードする正しい方法は何ですか。2)パラメータの1つに一重引用符が含まれている場合、それを文字列にエンコードする正しい方法は何ですか。
私はRESTAPIを使用することを好むので、TableServiceContextクラスを使用するように指示して応答しないでください。
よろしくお願いします。最後の注意:MSDN(http://msdn.microsoft.com/en-us/library/windowsazure/dd135727.aspx)のこのトピックに関するドキュメントは正しくありません。これは、パラメーターを一重引用符ではなく二重引用符で送信する必要があることを示しています。これを行うと、応答は403(禁止されたアクセス)になります。それを理解するのに少し時間がかかりました。