Azure表存储模拟器将SOH字符附加到分区和行键

问题描述:

我刚刚开始在本地计算机上使用Azure表存储(通过存储模拟器)。我将一些资源键存储在表存储器中;但是,当我使用分区键,行键或两者查询表(即使通过SQL Server Management Studio)时,也无法返回结果。Azure表存储模拟器将SOH字符附加到分区和行键

查询表存储的代码如下:

public async Task<TEntity> GetItemAsync(string partitionKey, string rowKey) 
    { 
     var table = client.GetTableReference(TableName); 

     var retrieveOperation = TableOperation.Retrieve<TEntity>(partitionKey, rowKey); 

     var retrievedResult = await table.ExecuteAsync(retrieveOperation); 

     if (retrievedResult.Result != null) 
     { 
      return (TEntity)retrievedResult.Result; 
     } 
     else 
     { 
      Trace.TraceWarning("The entity could not be retrieved."); 
      return null; 
     } 
    } 

当执行查询时,结果包含HTTP 404。

有没有人一个想法,这个问题可能是什么?如果它与正在追加的SOH字符有关,为什么Azure Table Storage会附加该字符?

SSMS screenshot from TableRow table

谢谢您的支持。

有没有人知道这个问题可能是什么?

据我所知,如果表不存在,通常会发生Http 404错误。 我建议你可以先检查你的表名是否存在。

如果它与正在追加的SOH字符有关,为什么Azure Table Storage会附加该字符?

据了解Table Service Data Model文章,以下字符不允许在用于PartitionKey和RowKey属性值: 控制字符从U + 0000到U + 001F,包括:

  • 水平标签(\ t)的字符
  • 换行(\ n)的字符
  • 回车(\ r)的字符
  • 距离U
  • 控制字符+ 007F到U + 009F

\ u0001是不允许的。

我也在我的电脑上写了一个测试演示,我们无法在分区键和行键中插入控制字符。

我的存储模拟器版本是4.6,azure存储包版本是8.0.1,我猜你插入控制字符的原因是关于你的模拟器版本和软件包版本。

我建议你可以安装关于模拟器的最新版本,然后重试。

下载链接:https://azure.microsoft.com/en-us/downloads/

此外,如果表属性类型是Edm.String,我建议你可以确保你插入的值是一个UFT-16编码值。

Edm.String:UTF-16编码的值。字符串值可能高达 64 KB的大小。