Azure Table批量查询后如何获取实体ETag实现并发控制?
解决Azure Table批量查询后获取单个实体ETag的问题
你不用先提取PartitionKey:RowKey集合再逐个请求单个实体,其实Azure Table Service的批量查询(带$filter的Get请求)返回的JSON数组里,每个实体对象本身就包含对应的ETag——它藏在@odata.etag字段里,不是从响应头获取的。
具体处理步骤:
给你的实体类新增一个ETag属性,用JSON序列化特性绑定到
@odata.etag字段:
如果用System.Text.Json:public class YourTableEntity { public string PartitionKey { get; set; } public string RowKey { get; set; } // 其他业务属性 [JsonPropertyName("@odata.etag")] public string ETag { get; set; } }如果用Newtonsoft.Json,就换成
[JsonProperty("@odata.etag")]。反序列化批量查询结果时,这个ETag属性会自动被赋值。之后做Put/Merge/Delete请求时,直接把该实体的ETag放到请求头的
If-Match中即可:var request = new HttpRequestMessage(HttpMethod.Put, $"your-table-endpoint/{entity.PartitionKey}/{entity.RowKey}"); request.Headers.Add("If-Match", entity.ETag); // 设置请求内容并发送请求
只有当你有特殊限制(比如完全自定义序列化、不想处理OData相关字段)时,才需要考虑逐个请求单个实体拿ETag,但这种方式会产生大量额外请求,性能损耗大,优先用上面的方案。
内容的提问来源于stack exchange,提问作者haPartnerships
相关产品推荐
相关产品推荐

