1

为 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 服务一起使用的行为符合预期。

4

0 回答 0