为 Windows Azure 表存储服务编写了以下代码:
var context = GetTableServiceContext();
context.AttachTo(_tableName, entity, eTag);
context.UpdateObject(entity);
var response = context.SaveChangesWithRetries(saveChangesOptions);
我使用此代码的目标是如果 eTag 与表存储中的实体不匹配,则抛出 412 的 http 状态代码(前提条件失败)。这样做是为了控制并发更新。执行时我遇到了一些奇怪的行为SaveChangesWithRetries
。根据eTag
传入的参数的值,会发生以下情况:
eTag
= W/”datetime'2010-08-17T23%3A43%3A26.1913755Z'” -> 假设这个 eTag 不匹配,那么我会得到一个 412。完美,这就是我要找的。
eTag
= W/"WrongETag" -> 我将收到状态代码为 400 的 DataServiceRequestException。唯一的错误消息是“输入无效”
eTag
= "wrongETag" -> 同上
似乎 azure 表服务需要格式比 HTTP 标准要求更严格的 eTag。只需要一个带引号的字符串,如果它很弱,则带有可选的 W/ 前缀。有人知道 Azure 表服务所需的具体格式吗?旁注:奇怪的是,将上述 ETag 与 Azure 的 Blob 服务一起使用的行为符合预期。