c# - 如何对 Azure 存储表行键和分区键进行编码?

标签 c# .net azure encoding azure-storage

我正在使用 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/

相关文章:

c# - 仅针对某些异常类型中断

c# - 在 MonoTouch 中有一个 NSFetchRequest 和一个 NSPredicate 支持

c# - 测试 Windows 服务项目花费的时间太长

c# - InvalidOperationException 和 NullReferenceException

c# - 如何在azure表存储中使用partitionkey加速查询

c# - 在 C# 中指定泛型类型参数时如何使用 `dynamic`?

c# - 转换后如何在图形对象中的任意位置绘制

.NET 5 ASP.NET Core 应用程序未在 Azure 中启动

c# - Microsoft Graph 使用仅应用程序身份验证从 @outlook.com 帐户读取邮件

asp.net-mvc - 利用 Azure 上的 MVC 站点的浏览器缓存