你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
多个 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-Match 和 If-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-Match 和 If-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-Since、 If-Match和 If-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-Since、 If-None-Match、 If-Unmodified-Since和 If-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 Blob 和 Get 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 条件头,且 评估 TagsPredicate 为 false,Blob 服务会返回作错误代码 412(前置条件失败)。
调用者必须有权限读取blob上的标签,才能使用 x-ms-if-tags 或 x-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(错误请求)的无效表达式的请求。