你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

为Blob服务作指定条件头部

多个 Blob 服务作支持使用条件头。 你可以指定条件头,只有在满足指定条件时才执行作。

Blob服务遵循 HTTP/1.1协议的条件头规范

支持的条件头

支持的条件头如下表所述。

条件头 Description
If-Modified-Since 一个 DateTime 值。 日期格式遵循 RFC 1123。 更多信息请参见“头部 中日期-时间值的表示”。 指定该头部仅在资源自指定时间以来被修改时执行该作。
If-Unmodified-Since 一个 DateTime 值。 日期格式遵循 RFC 1123。 更多信息请参见“头部 中日期-时间值的表示”。 指定该头部仅在资源未在指定日期/时间前被修改时执行作。
If-Match ETag 值。 仅当资源的 ETag 与指定的值匹配时,才指定此标头来执行该操作。 对于2011-08-18及以后版本,ETag可以用引号标注。
If-None-Match ETag 值或通配符 (*)。 指定该头部仅在资源的ETag与指定值不匹配时执行作。 对于2011-08-18及以后版本,ETag可以用引号标注。

指定万用符字符(*)仅在资源不存在时执行该作,若存在则失败。

在2013-08-15版本及之后版本中为blob服务读取作指定条件头部

从2013-08-15版本开始, 获取Blob获取Blob属性 作支持多个条件头。 你可以指定任意组合支持的条件头。 Blob服务根据以下表达式评估这些条件:

If-Match && If-Unmodified-Since && (If-None-Match || If-Modified-Since)

你也可以为和If-None-Match提供多个逗号分隔值。If-Match 如果你为 指定多个值, If-Match那么 Blob 服务会对所有提供的值执行逻辑 OR 作,然后再评估整个表达式。 如果你为 指定多个值, if-None-Match服务会在计算整个表达式之前执行逻辑 AND 作。 不支持为和If-Unmodified-Since指定多个值If-Modified-Since,导致错误代码400(Bad Request)。

此功能的启用是为了符合 HTTP/1.1 规范。 它还适用于内容分发网络(CDN)或代理服务器在飞行中请求中添加额外条件头的场景。 以下示例展示了几种不同的条件头组合。

示例 1:

考虑一个包含 If-MatchIf-Modified-Since 头部的 Get Blob 请求。 下表表示单独计算头部的结果,以及组合计算结果。

条件头 结果若单独评估 组合计算结果
If-Match 412(前提条件失败) 412(前提条件失败)
If-Modified-Since 200(正常) 412(前提条件失败)
If-Match 412(前提条件失败) 412(前提条件失败)
If-Modified-Since 304(未修改) 412(前提条件失败)
If-Match 200(正常) 200(正常)
If-Modified-Since 200(正常) 200(正常)
If-Match 200(正常) 304(未修改)
If-Modified-Since 304(未修改) 304(未修改)

示例 2:

考虑一个包含 If-None-MatchIf-Modified-Since 头部的请求。

条件头 结果若单独评估 组合计算结果
If-None-Match 304(未修改) 200(正常)
If-Modified-Since 200(正常) 200(正常)
If-None-Match 200(正常) 200(正常)
If-Modified-Since 200(正常) 200(正常)
If-None-Match 200(正常) 200(正常)
If-Modified-Since 304(未修改) 200(正常)
If-None-Match 304(未修改) 304(未修改)
If-Modified-Since 304(未修改) 304(未修改)

示例 3:

考虑一个包含 If-Modified-SinceIf-MatchIf-Unmodified-Since 头部的请求。

条件头 结果若单独评估 组合计算结果
If-Modified-Since 200(正常) 412(前提条件失败)
If-Match 412(前提条件失败) 412(前提条件失败)
If-Unmodified-Since 200(正常) 412(前提条件失败)
If-Modified-Since 200(正常) 412(前提条件失败)
If-Match 200(正常) 412(前提条件失败)
If-Unmodified-Since 412(前提条件失败) 412(前提条件失败)
If-Modified-Since 304(未修改) 412(前提条件失败)
If-Match 200(正常) 412(前提条件失败)
If-Unmodified-Since 412(前提条件失败) 412(前提条件失败)
If-Modified-Since 304(未修改) 304(未修改)
If-Match 200(正常) 304(未修改)
If-Unmodified-Since 200(正常) 304(未修改)

示例4:

考虑一个包含 If-Modified-SinceIf-None-MatchIf-Unmodified-SinceIf-Match 头部的请求。

组合 单个 HTTP 状态代码 获取Blob状态结果
If-Modified-Since 200(正常) 200(正常)
If-None-Match 200(正常) 200(正常)
If-Unmodified-Since 200(正常) 200(正常)
If-Match 200(正常) 200(正常)
If-Modified-Since 200(正常) 412(前提条件失败)
If-None-Match 304(未修改) 412(前提条件失败)
If-Unmodified-Since 412(前提条件失败) 412(前提条件失败)
If-Match 200(正常) 412(前提条件失败)
If-Modified-Since 200(正常) 200(正常)
If-None-Match 304(未修改) 200(正常)
If-Unmodified-Since 200(正常) 200(正常)
If-Match 200(正常) 200(正常)
If-Modified-Since 304(未修改) 412(前提条件失败)
If-None-Match 200(正常) 412(前提条件失败)
If-Unmodified-Since 200(正常) 412(前提条件失败)
If-Match 412(前提条件失败) 412(前提条件失败)
If-Modified-Since 304(未修改) 412(前提条件失败)
If-None-Match 200(正常) 412(前提条件失败)
If-Unmodified-Since 412(前提条件失败) 412(前提条件失败)
If-Match 412(前提条件失败) 412(前提条件失败)
If-Modified-Since 304(未修改) 200(正常)
If-None-Match 200(正常) 200(正常)
If-Unmodified-Since 200(正常) 200(正常)
If-Match 200(正常) 200(正常)
If-Modified-Since 304(未修改) 412(前提条件失败)
If-None-Match 304(未修改) 412(前提条件失败)
If-Unmodified-Since 412(前提条件失败) 412(前提条件失败)
If-Match 200(正常) 412(前提条件失败)

在2013-08-15之前的版本中,为读取作指定条件头部,以及所有版本的写入作。

在调用版本早于 2013-08-15 的 Blob 服务读取作(Get BlobGet Blob Properties)时,以及调用任何写入作(无论版本如何),请记住以下几点:

  • 如果请求同时 If-None-Match 指定了和 If-Modified-Since 头部,则根据中 If-None-Match指定的条件进行评估。

  • 如果请求同时 If-Match 指定了和 If-Unmodified-Since 头部,则根据中 If-Match指定的条件进行评估。

  • 除了前面提到的两种条件头部组合外,一个请求可能只指定一个条件头部。 指定多个条件头会导致状态代码400(Bad Request)。

  • 如果响应包含ETag,请在处理ETag前核实请求和响应的版本。 例如,2011-08-18及以后版本会返回引号ETag,但较旧版本则不返回。 确保你的申请能在评估前处理两种ETag格式。

  • RFC 2616 允许单个头部中包含多个 ETag 值,但对 Blob 服务的请求只能包含一个 ETag 值。 指定多个ETag值会导致状态代码为400(Bad Request)。

支持条件头部的作

支持条件头的作如下表所述。

REST作 操作类型 支持的条件头
追加块

(版本为2015-02-21及以后)
写入 如果修饰自从(If-modified-Cause)

如果-未修改-因为

如果匹配

如果无匹配

x-ms-if-标签
从 URL 追加块

(版本为2018-11-09及以后)
写入 如果修饰自从(If-modified-Cause)

如果-未修改-因为

如果匹配

如果无匹配

x-ms-if-标签
复制 Blob 读取和写入 对于目标斑点的条件:

- 如果修饰自从(If-modified-Cause)

- 如果-未修改-因为

- 如果匹配

- 如果无匹配

- x-ms-if-标签

对于源斑点的条件:

- x-ms-来源-如果-修改-since

- x-ms-source-if-unmodified-since

- x-ms-来源-if-匹配

- x-ms-来源-if-none-匹配

- x-ms-source-if-tags
删除 Blob 写入 如果修饰自从(If-modified-Cause)

如果-未修改-因为

如果匹配

如果无匹配

x-ms-if-标签
删除容器 写入 如果修饰自从(If-modified-Cause)

如果-未修改-因为
获取 Blob 读取 如果修饰自从(If-modified-Cause)

如果-未修改-因为

如果匹配

如果无匹配

x-ms-if-标签
获取 Blob 元数据 读取 如果修饰自从(If-modified-Cause)

如果-未修改-因为

如果匹配

如果无匹配

x-ms-if-标签
获取 Blob 属性 读取 如果修饰自从(If-modified-Cause)

如果-未修改-因为

如果匹配

如果无匹配

x-ms-if-标签
获取 Blob 标记

读取 x-ms-if-标签 (版本2019-12-12及以后)

关于blob的条件(版本2025-11-05及以后):

- x-ms-blob-if-modified-since

- x-ms-blob-if-unmodified-since

- x-ms-blob-if-匹配

- x-ms-blob-if-none-匹配
获取黑名单 读取 x-ms-if-标签
获取页面范围 读取 如果修饰自从(If-modified-Cause)

如果-未修改-因为

如果匹配

如果无匹配

x-ms-if-标签
租用 Blob 写入 如果修饰自从(If-modified-Cause)

如果-未修改-因为

如果匹配

如果无匹配

x-ms-if-标签
Lease Container(租赁容器) 写入 如果修饰自从(If-modified-Cause)

如果-未修改-因为
从URL输入Blob 写入 如果修饰自从(If-modified-Cause)

如果-未修改-因为

如果匹配

如果无匹配

对于源斑点的条件:

- x-ms-来源-如果-修改-自从

- x-ms-source-if-未修改-Since

- x-ms-来源-如果匹配

- x-ms-来源-如果-无匹配

放置 Blob 写入 如果修饰自从(If-modified-Cause)

如果-未修改-因为

如果匹配

如果无匹配

x-ms-if-标签
从 URL 放置块

(版本为2018-03-28及以后)
写入 x-ms-来源-如果-修改-自从

x-ms-来源-如果-未修改-自

x-ms-来源-如果匹配

x-ms-来源-如果-无匹配
放置黑名单 写入 如果修饰自从(If-modified-Cause)

如果-未修改-因为

如果匹配

如果无匹配

x-ms-if-标签
放置页 写入 如果修饰自从(If-modified-Cause)

如果-未修改-因为

如果匹配

如果无匹配

x-ms-if-标签
从 URL 放置页

(版本为2018-11-09及以后)
写入 如果修饰自从(If-modified-Cause)

如果-未修改-因为

如果匹配

如果无匹配

x-ms-if-标签
设置 Blob 元数据 写入 如果修饰自从(If-modified-Cause)

如果-未修改-因为

如果匹配

如果无匹配

x-ms-if-标签
设置 Blob 属性 写入 如果修饰自从(If-modified-Cause)

如果-未修改-因为

如果匹配

如果无匹配

x-ms-if-标签
设置容器 ACL 写入 如果修饰自从(If-modified-Cause)

如果-未修改-因为
Set Container Metadata 写入 如果修饰自从(If-modified-Cause)
设置 Blob 标记

写入 x-ms-if-标签 (版本2019-12-12及以后)

关于blob的条件(版本2025-11-05及以后):

- x-ms-blob-if-modified-since

- x-ms-blob-if-unmodified-since

- x-ms-blob-if-匹配

- x-ms-blob-if-none-匹配
设置 Blob 层 写入 x-ms-if-标签
快照 Blob 读取 如果修饰自从(If-modified-Cause)

如果-未修改-因为

如果匹配

如果无匹配

x-ms-if-标签
Set Blob 不可变性策略 写入 如果-未修改-因为

以下 Blob 服务数据作目前不支持条件头:

支持条件头部作的HTTP响应代码

如果请求包含条件头部且请求的资源不满足指定条件,Blob服务会返回HTTP响应码。 返回的响应码符合HTTP/1.1协议规范(RFC 2616)。

Azure .NET 客户端库中的方法将这些错误响应码转换为 StorageException 对象。

阅读作

下表表示当作为读取作时,每个条件标部未满足条件时返回的响应代码。 读取作使用动词 GET 或 HEAD。

条件头 如果条件未满足,则用回应代码
If-Modified-Since 未修改(304(未修改))
If-Unmodified-Since 前提条件失败(412(前提条件失败))
If-Match 前提条件失败(412(前提条件失败))
If-None-Match 未修改(304(未修改))

在使用2013-08-15版本或更高版本的多个头部时,请参考之前的示例。

写作

下表表示当作为写入作时,每个条件头未满足条件时返回的响应码。 写入作使用动词 PUT 或 DELETE。

条件头 如果条件未满足,则用回应代码
If-Modified-Since 前提条件失败(412(前提条件失败))
If-Unmodified-Since 前提条件失败(412(前提条件失败))
If-Match 前提条件失败(412(前提条件失败))
If-None-Match 前提条件失败(412(前提条件失败))

复制作

下表表示当作为复制作时,每个条件头未满足条件时返回的响应代码。 复制 Blob作使用动词 PUT。

条件头 如果条件未满足,则用回应代码
If-Modified-Since 前提条件失败(412(前提条件失败))
If-Unmodified-Since 前提条件失败(412(前提条件失败))
If-Match 前提条件失败(412(前提条件失败))
If-None-Match 前提条件失败(412(前提条件失败))
x-ms-source-if-modified-since 前提条件失败(412(前提条件失败))
x-ms-source-if-unmodified-since 前提条件失败(412(前提条件失败))
x-ms-source-if-match 前提条件失败(412(前提条件失败))
x-ms-source-if-none-match 前提条件失败(412(前提条件失败))

标签 条件作

除了 Blob 服务支持的标准 HTTP 条件头部外,还有若干作支持针对 blob 资源标签的条件。

条件头 Description
x-ms-if-tags 版本为2019-12-12及以后。 一个 TagsPredicate 值。 指定该头只有在谓词对 blob 标签的 评估 时 true 才执行该作。
x-ms-source-if-tags 版本为2019-12-12及以后。 只适用于复制斑点。 一个 TagsPredicate 值。 指定该头只有在谓词对源blob的标签计算到时 true 才执行该作。

如果 x-ms-if-tags 请求中存在 或 x-ms-source-if-tags 条件头,且 评估 TagsPredicatefalse,Blob 服务会返回作错误代码 412(前置条件失败)。

调用者必须有权限读取blob上的标签,才能使用 x-ms-if-tagsx-ms-source-if-tags 条件首部。

标签 谓词句法

Blob 服务支持ANSI SQL中句句语法的子集,用于标头值 TagsPredicate 。 支持以下运算符:

Operator Description Example
= Equal Status = 'In Progress'
<> 不等于 Status <> 'Done'
> 大于 LastModified > '2018-06-18 20:51:26Z'
>= 大于或等于 Priority >= '05'
< 小于 Age < '032'
<= 小于或等于 Reviewer <= 'Smith'
AND 逻辑与 Name > 'C' AND Name < 'D'
Age > '032' AND Age < '100'
OR 逻辑或 Status = 'Done' or LastModified > '2018-06-18 20:51:26Z'

所有标签值都是字符串,支持的二进制关系运算符使用字典序排序标签值。 为了支持非字符串数据类型,包括数字和日期,必须采用适当的填充和可排序格式。 标签值必须用单引号包住。

如果标签名称是常规的SQL标识符,它们可能存在但不会逃逸。 如果它们包含任何特殊字符,必须用双引号分隔,例如 "TagName" = 'TagValue'

表达式可能包括多个标签名称和值的比较。 括号(())可用于分组逻辑表达式并控制规范的作顺序。 A TagsPredicate 最多可能包含 10 个逻辑作。

存储服务拒绝任何包含错误代码400(错误请求)的无效表达式的请求。

另请参阅

Blob 服务概念