7

Azure テーブル ストレージに URI を RowKey 値として保存したいと思っています。ドキュメントによると、RowKeys には URI で一般的に見られる文字 (/、\、#、?) を含めることはできません。

解決策は簡単に思えます: URI をエンコードするだけです。しかし、それはうまくいきません。何らかの理由で、シーケンス %2f (スラッシュのエンコードされた値) を含む値は挿入できますが、'%2f' に禁止文字が含まれていなくてもクエリは実行できません。

では、base64 エンコーディングはどうでしょうか。いいえ。ときどきスラッシュ文字が生成されますが、これは許可されていません。

では、Azure テーブルに RowKey として確実に格納できる文字列 (URI) をエンコードする方法はありますか? 必須ではありませんが、人間が判読できるものが望ましいです。

4

5 に答える 5

0

いくつかの可能性:

  1. 特定のエンコーディング(UTF-8など)を使用してバイトを変換してから、バイトを16進数としてエンコードします。それを鍵として使ってください。ただし、一部のURIは非常に長くなる可能性があり、キーはさらに長くなるため、RowKeyの最大長に達する可能性があります。
  2. URIをハッシュします(たとえば、MD5を使用)。これらのバイトを16進数でエンコードし、キーとして使用します。衝突の可能性がありますが、PartitionKeyがその可能性を排除する可能性があることに注意してください。ハッシュは一定の長さであるため、RowKeyの最大長に問題はありません。

他にもアイデアがあると思いますので、ぜひ聞いてみたいと思います。

于 2012-09-21T22:23:19.573 に答える
0

トピックとは関係ありませんが、テーブルと PK/RK のルールはまったく異なりますが、テーブルを動的に作成しており、必要に応じて役立つコードがあります。"^[A-Za-z][A-Za-z0-9]{2,62}$"."

おそらく、これを使用して独自のソリューションを刺激することができます

文字列をデコードする

        string edit1 = host
            .Replace("qqu", "_")
            .Replace("qqh", "-")
            .Replace("qqp", ".")

            // NOTE: qqn is reserved leading sequence

            .Replace("qqt", "qqu")
            .Replace("qqo", "qqp")
            .Replace("qqg", "qqh")
            ;

        if (edit1.StartsWith("qqn"))
        {
            edit1 = edit1.Substring(3, edit1.Length);
        }
        if (edit1.StartsWith("qq"))
        {
            edit1 = edit1.Substring(2, edit1.Length);
        }

文字列をエンコードするメソッド

            string edit1 = this.originalName.ToLower().Trim()
                .Replace("qqu", "qqt")
                .Replace("qqp", "qqo")
                .Replace("qqh", "qqg")

                // NOTE: qqn is reserved leading sequence

                .Replace("_", "qqu")
                .Replace("-", "qqh")
                .Replace(".", "qqp");

            string test = "qq";
            if (edit1.StartsWith(test))
                return test + "n" + edit1;

            test = "0";
            if (edit1.StartsWith(test))
                return "qq" + edit1;

            test = "1";
            if (edit1.StartsWith(test))
                return "qq" + edit1;

            test = "2";
            if (edit1.StartsWith(test))
                return "qq" + edit1;

            test = "3";
            if (edit1.StartsWith(test))
                return "qq" + edit1;

            test = "4";
            if (edit1.StartsWith(test))
                return "qq" + edit1;

            test = "5";
            if (edit1.StartsWith(test))
                return "qq" + edit1;

            test = "6";
            if (edit1.StartsWith(test))
                return "qq" + edit1;

            test = "7";
            if (edit1.StartsWith(test))
                return "qq" + edit1;

            test = "8";
            if (edit1.StartsWith(test))
                return "qq" + edit1;

            test = "9";
            if (edit1.StartsWith(test))
                return "qq" + edit1;

            test = "0";
            if (edit1.StartsWith(test))
                return "qq" + edit1;
于 2012-09-22T00:22:24.760 に答える
0

URL 内のすべての不正な行キー文字 (\、/、?) を、URL 内で不正な文字 (例: <、>、%) に置き換えます。

于 2013-02-14T09:17:32.737 に答える