多種 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 版本開始, Get Blob 和 Get Blob Properties 操作支援多個條件標頭。 你可以指定任何支援的條件標頭組合。 Blob 服務會根據以下表達式來評估這些條件:
If-Match && If-Unmodified-Since && (If-None-Match || If-Modified-Since)
你也可以為 和 If-None-Match提供多個逗號分隔值If-Match。 如果你為 指定多個值, If-MatchBlob 服務會在評估整個表達式前,對所有提供的值執行邏輯 OR 操作。 如果你為 設定多個值, if-None-Match服務會在評估整個表達式前執行邏輯 AND 操作。 不支援為 和 If-Unmodified-Since 指定多個值If-Modified-Since,會導致錯誤代碼 400(Bad Request)。
此功能啟用是為了符合 HTTP/1.1 規範。 它也適用於內容傳遞網路(CDN)或代理伺服器在飛行中請求中加入額外條件標頭的情況。 以下範例說明了多種不同的條件標頭組合。
範例 1:
考慮一個包含 If-Match and 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(未修改) |
範例四:
考慮一個包含 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-MatchIf-Modified-Since標頭,則依據 中If-None-Match指定的條件評估請求。若請求同時指定 與
If-MatchIf-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-Since If-未修改-因為 如果匹配 如果無匹配 x-ms-if-標籤 |
|
從網址附加封鎖 (版本為2018-11-09及之後) |
書寫 |
If-modified-Since If-未修改-因為 如果匹配 如果無匹配 x-ms-if-標籤 |
| 複製 Blob | 讀取和寫入 | 對於目標斑點的條件: - If-modified-Since - If-未修改-因為 - 如果匹配 - 如果無匹配 - x-ms-if-標籤 對於源斑點的條件: - x-ms-來源-如果-修改-since - x-ms-來源-if-unmodified-since - x-ms-來源-if-match。 - x-ms-來源-if-none-匹配 - x-ms-來源-if-tags |
| 刪除 Blob | 書寫 |
If-modified-Since If-未修改-因為 如果匹配 如果無匹配 x-ms-if-標籤 |
| 刪除容器 | 書寫 |
If-modified-Since If-未修改-因為 |
| 抓布洛布 | 參閱 |
If-modified-Since If-未修改-因為 如果匹配 如果無匹配 x-ms-if-標籤 |
| 取得 Blob 中繼資料 | 參閱 |
If-modified-Since If-未修改-因為 如果匹配 如果無匹配 x-ms-if-標籤 |
| 取得 Blob 屬性 | 參閱 |
If-modified-Since If-未修改-因為 如果匹配 如果無匹配 x-ms-if-標籤 |
|
取得 Blob 標籤 |
參閱 |
x-ms-if-tags (版本 2019-12-12 及以後) 關於 blob 的條件(版本 2025-11-05 及以後): - x-ms-blob-if-modified-since - x-ms-blob-if-未修改-因為 - x-ms-blob-if-匹配 - x-ms-blob-if-none-match(不匹配) |
| 取得封鎖清單 | 參閱 | x-ms-if-標籤 |
| 取得頁面範圍 | 參閱 |
If-modified-Since If-未修改-因為 如果匹配 如果無匹配 x-ms-if-標籤 |
| 租用 Blob | 書寫 |
If-modified-Since If-未修改-因為 如果匹配 如果無匹配 x-ms-if-標籤 |
| 租用容器 | 書寫 |
If-modified-Since If-未修改-因為 |
| 從網址輸入 blob | 書寫 |
If-modified-Since If-未修改-因為 如果匹配 如果無匹配 對於源斑點的條件: - x-ms-來源-如果-修改-自從 - x-ms-來源-if-未修改-自從 - x-ms-來源-如果匹配 - x-ms-來源-如果-無匹配 |
| Put Blob \(英文\) | 書寫 |
If-modified-Since If-未修改-因為 如果匹配 如果無匹配 x-ms-if-標籤 |
|
設定從網址封鎖 (版本為 2018-03-28 及以後) |
書寫 |
x-ms-來源-如果-修改-自從 x-ms-來源-如果-未修改-自從 x-ms-來源-如果匹配 x-ms-來源-如果-無匹配 |
| 放置封鎖清單 | 書寫 |
If-modified-Since If-未修改-因為 如果匹配 如果無匹配 x-ms-if-標籤 |
| 放置頁面 | 書寫 |
If-modified-Since If-未修改-因為 如果匹配 如果無匹配 x-ms-if-標籤 |
|
從網址輸入頁面 (版本為2018-11-09及之後) |
書寫 |
If-modified-Since If-未修改-因為 如果匹配 如果無匹配 x-ms-if-標籤 |
| 設定 Blob 中繼資料 | 書寫 |
If-modified-Since If-未修改-因為 如果匹配 如果無匹配 x-ms-if-標籤 |
| Set Blob Properties \(英文\) | 書寫 |
If-modified-Since If-未修改-因為 如果匹配 如果無匹配 x-ms-if-標籤 |
| Set Container ACL (設定容器 ACL) | 書寫 |
If-modified-Since If-未修改-因為 |
| Set Container Metadata | 書寫 | If-modified-Since |
|
設定 Blob 標籤 |
書寫 |
x-ms-if-tags (版本 2019-12-12 及以後) 關於 blob 的條件(版本 2025-11-05 及以後): - x-ms-blob-if-modified-since - x-ms-blob-if-未修改-因為 - x-ms-blob-if-匹配 - x-ms-blob-if-none-match(不匹配) |
| 設定 Blob 級別 | 書寫 | x-ms-if-標籤 |
| 快照方塊 | 參閱 |
If-modified-Since If-未修改-因為 如果匹配 如果無匹配 x-ms-if-標籤 |
| 設定 blob 不可變性政策 | 書寫 | If-未修改-因為 |
以下 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 or x-ms-source-if-tags 條件標頭。
標籤 謂詞語法
Blob 服務支援 ANSI SQL WHERE 子集,用於標頭值 TagsPredicate 。 支援下列運算子:
| Operator | Description | Example |
|---|---|---|
= |
平等 | 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(錯誤請求)的無效表達式的請求。