我正在使用 Azure 存储表,并且我有数据进入其中包含斜杠的 RowKey。根据this MSDN page ,PartitionKey 和 RowKey 中不允许使用以下字符:
The forward slash (/) character
The backslash () character
The number sign (#) character
The question mark (?) character
Control characters from U+0000 to U+001F, including:
The horizontal tab (\t) character
The linefeed (\n) character
The carriage return (\r) character
Control characters from U+007F to U+009F
我见过一些人使用 URL 编码来解决这个问题。不幸的是,这可能会出现一些问题,例如能够插入但无法删除某些实体。我还看到有些人使用 base64 编码,但这也可能包含不允许的字符。
如何有效地编码我的 RowKey,而不遇到不允许的字符,或滚动我自己的编码?
最佳答案
于 2020 年 8 月 18 日更新了 Azure 搜索中“+”字符的(新?)问题。有关背景信息,请参阅下面 @mladenb 的评论。值得注意的是,引用的文档页面不排除“+”字符。
当 URL 采用 Base64 编码时,Azure 表存储键列中唯一无效的字符是正斜杠 (“/”)。要解决此问题,只需将正斜杠字符替换为另一个字符,该字符 (1) 在 Azure 表存储键列中有效且 (2) 不是 Base64 字符。我发现的最常见的示例(在其他答案中引用)是将正斜杠('/')替换为下划线('_')。
private static String EncodeUrlInKey(String url)
{
var keyBytes = System.Text.Encoding.UTF8.GetBytes(url);
var base64 = System.Convert.ToBase64String(keyBytes);
return base64.Replace('/','_').Replace('+','-');
}
解码时,只需撤消替换的字符(首先!),然后 Base64 解码结果字符串。这就是全部内容。
private static String DecodeUrlInKey(String encodedKey)
{
var base64 = encodedKey.Replace('-','+').Replace('_', '/');
byte[] bytes = System.Convert.FromBase64String(base64);
return System.Text.Encoding.UTF8.GetString(bytes);
}
有人建议其他 Base64 字符也需要编码。根据Azure Table Storage docs事实并非如此。
关于c# - 如何对 Azure 存储表行键和分区键进行编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21144694/