使用模拟存储时Azure AzureException(在记录的约束内)

时间:2017-06-26 06:56:39

标签: azure azure-table-storage azure-emulator

我们的应用程序执行多批TableBatchOperation。我们确保每个表批处理操作都具有

  • 100个或更少的表操作
  • 仅一个实体分区键的表操作

遵循以下内容:

        foreach (var batch in batches)
        {
            var operation = new TableBatchOperation();
            operation.AddRange(batch.Select(x => TableOperation.InsertOrReplace(x)));
            await table.ExecuteBatchAsync(operation);
        }
  • 当我们使用模拟存储时,我们正在点击Microsoft.WindowsAzure.Storage.StorageException - "批量中的元素99返回了意外的响应代码。"
  • 当我们使用生产Azure时,一切正常。

仿真存储配置如下:

<add key="StorageConnectionString" value="UseDevelopmentStorage=true;" />

我担心虽然一切都在生产中正常工作(我们使用的是真正的Azure),但是它模拟存储的爆炸可能是我们做某些我们不应该做的事情的症状。是的。

我已经使用调试器运行它(在它爆炸之前)并验证了(根据API):

  • 序列化为JSON(984186字节为UTF-16)时,整个操作仅为492093个字符
  • 正好有100个操作
  • 所有实体都具有相同的分区键

请参阅https://docs.microsoft.com/en-us/dotnet/api/microsoft.windowsazure.storage.table.tablebatchoperation?view=azurestorage-8.1.3

修改 看起来其中一个项目(#71/100)导致此失败。在结构上它与其他项目没有什么不同,但它确实有一些相当长的字符串属性 - 所以可能有一个未记录的限制/错误?

修改 以下Unicode UTF-16字节序列(在字符串属性上)足以导致异常:

r     e     n     U+0019         space
114 0 101 0 110 0 25 0 115 0 32 0

(它的字节 25 0 115 0 ,即导致异常的unicode媒体结束U + 0019。

修改 失败实体的完整示例:

JSON:

{"SomeProperty":"ren\u0019s ","PartitionKey":"SomePartitionKey","RowKey":"SomeRowKey","Timestamp":"0001-01-01T00:00:00+00:00","ETag":null}

实体类:

public class TestEntity : TableEntity
{
    public string SomeProperty { get; set; }
}

实体对象构造:

var entity = new TestEntity
{
    SomeProperty = Encoding.Unicode.GetString(new byte[]
        {114, 0, 101, 0, 110, 0, 25, 0, 115, 0, 32, 0}),
    PartitionKey = "SomePartitionKey",
    RowKey = "SomeRowKey"
};

1 个答案:

答案 0 :(得分:0)

根据您的描述,我也可以重现您提到的问题。经过我测试后我发现了特殊的 Unicode字符&#39; END OF MEDIUM&#39; (U + 0019)似乎 Azure存储模拟器不支持。如果可以替换为其他unicode,请尝试使用另一个unicode代替它。

我们也可以将我们的feedback提供给Azure存储团队。