我有这样的字符串:
RowKey = "Local (Automatic/Manual) Tests",
当我尝试在Windows Azure中存储时,这会失败,因为我认为它不接受"/"作为行键的一部分。
是否有一个简单的方法,我可以编码的值之前放入RowKey?
同样,一旦数据在表中,我用以下命令将其取出:
var Stores = storeTable.GetAll(u => u.PartitionKey == "ABC");
是否有一个简单的方法,我可以得到RowKey的值和解码它?
一种可能的处理方法是转换Base64编码字符串中的PartitionKey和RowKey值并保存它。稍后当您检索这些值时,只需对其进行解码。事实上,我有这个问题几天前在我们的工具和Base64编码建议我在MSDN论坛:http://social.msdn.microsoft.com/Forums/en-US/windowsazuredata/thread/a20cd3ce-20cb-4273-a1f2-b92a354bd868。但这也不是万无一失的。
我不熟悉Azure,所以我不知道是否有一个现有的API。但是编写代码并不难:
编码:
const string escapeChar='|';
RowKey.Replace(escapeChar,escapeChar+escapeChar).Replace("/",escapeChar+"S");
解码:
StringBuilder sb=new StringBuilder(s.Length);
bool escape=false;
foreach(char c in s)
{
if(escape)
{
if(c=='S')
sb.Append('/');
else if(c==escapeChar)
sb.Append(escapeChar);
else
throw new ArgumentException("Invalid escape sequence "+escapeChar+c);
}
else if(c!=escapeChar)
{
sb.Append(c);
escape=false;
}
else
escape=true;
return sb.ToString();
当字符串是Base64编码时,在Azure表存储键列中唯一无效的字符是正斜杠('/')。要解决这个问题,只需将正斜杠字符替换为另一个字符(1)在Azure表存储键列中有效,(2)不是Base64字符。我发现的最常见的例子(在其他答案中引用)是用下划线(_)替换正斜杠('/')。
private static String EncodeToKey(String originalKey)
{
var keyBytes = System.Text.Encoding.UTF8.GetBytes(originalKey);
var base64 = System.Convert.ToBase64String(keyBytes);
return base64.Replace('/','_');
}
解码时,只需撤销替换的字符(首先!),然后Base64解码结果字符串。这就是它的全部。
private static String DecodeFromKey(String encodedKey)
{
var base64 = encodedKey.Replace('_', '/');
byte[] bytes = System.Convert.FromBase64String(base64);
return System.Text.Encoding.UTF8.GetString(bytes);
}
一些人建议其他Base64字符也需要编码。根据Azure表存储文档,情况并非如此。