Angeben von bedingten Headern für Blobdienstvorgänge
Einige Vorgänge des Blob-Diensts unterstützen die Verwendung von bedingten Headern. Sie können mit bedingten Headern festlegen, dass ein Vorgang nur ausgeführt wird, wenn eine angegebene Bedingung erfüllt wurde.
Der Blobdienst folgt der HTTP/1.1-Protokollspezifikation für bedingte Header.
Unterstützte bedingte Header
Die unterstützten bedingten Header werden in der folgenden Tabelle beschrieben.
Bedingter Header | BESCHREIBUNG |
---|---|
If-Modified-Since |
Ein DateTime -Wert. Das Datumsformat entspricht RFC 1123. Weitere Informationen finden Sie unter Darstellung von Datums-/Uhrzeitwerten in Headern. Mit diesem Header legen Sie fest, dass der Vorgang nur ausgeführt wird, wenn die Ressource seit der angegebenen Zeit geändert wurde. |
If-Unmodified-Since |
Ein DateTime -Wert. Das Datumsformat entspricht RFC 1123. Weitere Informationen finden Sie unter Darstellung von Datums-/Uhrzeitwerten in Headern. Mit diesem Header legen Sie fest, dass der Vorgang nur ausgeführt wird, wenn die Ressource seit dem angegebenen Datum/der angegebenen Uhrzeit nicht geändert wurde. |
If-Match |
Ein ETag-Wert. Mit diesem Header legen Sie fest, dass der Vorgang nur ausgeführt wird, wenn das ETag der Ressource mit dem angegebenen Wert übereinstimmt. In Version 2011-08-18 und höher kann das ETag in Anführungszeichen angegeben werden. |
If-None-Match |
Ein ETag-Wert oder das Platzhalterzeichen (*). Mit diesem Header legen Sie fest, dass der Vorgang nur ausgeführt wird, wenn das ETag der Ressource nicht mit dem angegebenen Wert übereinstimmt. In Version 2011-08-18 und höher kann das ETag in Anführungszeichen angegeben werden. Mit dem Platzhalterzeichen (*) legen Sie fest, dass der Vorgang nur ausgeführt wird, wenn die Ressource nicht vorhanden ist, und fehlschlägt, wenn die Ressource vorhanden ist. |
Festlegen bedingter Header für Blob-Dienst-Lesevorgänge in Version in 2013-08-15 oder höher
Ab Version 2013-08-15 unterstützen die Vorgänge Blob abrufen und Blobeigenschaften abrufen mehrere bedingte Header. Sie können eine beliebige Kombination unterstützter bedingter Header angeben. Der Blob-Dienst wertet diese Bedingungen gemäß dem folgenden Ausdruck aus:
If-Match && If-Unmodified-Since && (If-None-Match || If-Modified-Since)
Sie können mehrere durch Trennzeichen getrennte Werte für If-Match
und If-None-Match
angeben. Wenn Sie mehrere Werte für If-Match
angeben, führt der Blob-Dienst vor der Auswertung des gesamten Ausdrucks einen logischen OR
-Vorgang für alle bereitgestellten Werte aus. Wenn Sie mehrere Werte für if-None-Match
angeben, führt der Dienst vor der Auswertung des gesamten Ausdrucks einen logischen AND
-Vorgang aus. Das Festlegen mehrerer Werte für If-Modified-Since
und If-Unmodified-Since
wird nicht unterstützt und führt zur Ausgabe von Fehlercode 400 (Bad Request
).
Dieses Feature ist aktiviert, um die HTTP/1.1-Spezifikation zu erfüllen und szenarien zu unterstützen, in denen ein CDN (Content Delivery Network) oder Proxyserver einer Inflightanforderung zusätzliche bedingte Header hinzufügt. Im Folgenden finden Sie einige Beispiele dafür, wie bedingte Header kombiniert werden können.
Beispiel 1:
Erwägen Sie eine Anforderung zum Abrufen von Blobs , die die If-Match
Header und If-Modified-Since
enthält. Der folgenden Tabelle können Sie den Statuscode entnehmen, der abhängig davon zurückgegeben wird, ob die Header einzeln oder in Kombination ausgewertet werden.
Bedingte Header | Ergebnis der Einzelauswertung | Ergebnis der kombinierten Auswertung |
---|---|---|
If-Match |
412 (Vorbedingung nicht erfüllt) | 412 (Vorbedingung nicht erfüllt) |
If-Modified-Since |
200 (OK) | 412 (Vorbedingung nicht erfüllt) |
If-Match |
412 (Vorbedingung nicht erfüllt) | 412 (Vorbedingung nicht erfüllt) |
If-Modified-Since |
304 (Nicht geändert) | 412 (Vorbedingung nicht erfüllt) |
If-Match |
200 (OK) | 200 (OK) |
If-Modified-Since |
200 (OK) | 200 (OK) |
If-Match |
200 (OK) | 304 (Nicht geändert) |
If-Modified-Since |
304 (Nicht geändert) | 304 (Nicht geändert) |
Beispiel 2:
Es wird eine Anforderung verwendet, die den If-None-Match
-Header und den If-Modified-Since
-Header enthält.
Bedingte Header | Ergebnis der Einzelauswertung | Ergebnis der kombinierten Auswertung |
---|---|---|
If-None-Match |
304 (Nicht geändert) | 200 (OK) |
If-Modified-Since |
200 (OK) | 200 (OK) |
If-None-Match |
200 (OK) | 200 (OK) |
If-Modified-Since |
200 (OK) | 200 (OK) |
If-None-Match |
200 (OK) | 200 (OK) |
If-Modified-Since |
304 (Nicht geändert) | 200 (OK) |
If-None-Match |
304 (Nicht geändert) | 304 (Nicht geändert) |
If-Modified-Since |
304 (Nicht geändert) | 304 (Nicht geändert) |
Beispiel 3:
Es wird eine Anforderung verwendet, die den If-Modified-Since
, If-Match
-Header und den If-Unmodified-Since
-Header umfasst.
Bedingte Header | Ergebnis der Einzelauswertung | Ergebnis der kombinierten Auswertung |
---|---|---|
If-Modified-Since |
200 (OK) | 412 (Vorbedingung nicht erfüllt) |
If-Match |
412 (Vorbedingung nicht erfüllt) | 412 (Vorbedingung nicht erfüllt) |
If-Unmodified-Since |
200 (OK) | 412 (Vorbedingung nicht erfüllt) |
If-Modified-Since |
200 (OK) | 412 (Vorbedingung nicht erfüllt) |
If-Match |
200 (OK) | 412 (Vorbedingung nicht erfüllt) |
If-Unmodified-Since |
412 (Vorbedingung nicht erfüllt) | 412 (Vorbedingung nicht erfüllt) |
If-Modified-Since |
304 (Nicht geändert) | 412 (Vorbedingung nicht erfüllt) |
If-Match |
200 (OK) | 412 (Vorbedingung nicht erfüllt) |
If-Unmodified-Since |
412 (Vorbedingung nicht erfüllt) | 412 (Vorbedingung nicht erfüllt) |
If-Modified-Since |
304 (Nicht geändert) | 304 (Nicht geändert) |
If-Match |
200 (OK) | 304 (Nicht geändert) |
If-Unmodified-Since |
200 (OK) | 304 (Nicht geändert) |
Beispiel 4:
Es wird eine Anforderung verwendet, die die Header If-Modified-Since
, If-None-Match
, If-Unmodified-Since
und If-Match
umfasst.
Kombination | Einzelner HTTP-Statuscode | Abgerufener BLOB-Status |
---|---|---|
If-Modified-Since |
200 (OK) | 200 (OK) |
If-None-Match |
200 (OK) | 200 (OK) |
If-Unmodified-Since |
200 (OK) | 200 (OK) |
If-Match |
200 (OK) | 200 (OK) |
If-Modified-Since |
200 (OK) | 412 (Vorbedingung nicht erfüllt) |
If-None-Match |
304 (Nicht geändert) | 412 (Vorbedingung nicht erfüllt) |
If-Unmodified-Since |
412 (Vorbedingung nicht erfüllt) | 412 (Vorbedingung nicht erfüllt) |
If-Match |
200 (OK) | 412 (Vorbedingung nicht erfüllt) |
If-Modified-Since |
200 (OK) | 200 (OK) |
If-None-Match |
304 (Nicht geändert) | 200 (OK) |
If-Unmodified-Since |
200 (OK) | 200 (OK) |
If-Match |
200 (OK) | 200 (OK) |
If-Modified-Since |
304 (Nicht geändert) | 412 (Vorbedingung nicht erfüllt) |
If-None-Match |
200 (OK) | 412 (Vorbedingung nicht erfüllt) |
If-Unmodified-Since |
200 (OK) | 412 (Vorbedingung nicht erfüllt) |
If-Match |
412 (Vorbedingung nicht erfüllt) | 412 (Vorbedingung nicht erfüllt) |
If-Modified-Since |
304 (Nicht geändert) | 412 (Vorbedingung nicht erfüllt) |
If-None-Match |
200 (OK) | 412 (Vorbedingung nicht erfüllt) |
If-Unmodified-Since |
412 (Vorbedingung nicht erfüllt) | 412 (Vorbedingung nicht erfüllt) |
If-Match |
412 (Vorbedingung nicht erfüllt) | 412 (Vorbedingung nicht erfüllt) |
If-Modified-Since |
304 (Nicht geändert) | 200 (OK) |
If-None-Match |
200 (OK) | 200 (OK) |
If-Unmodified-Since |
200 (OK) | 200 (OK) |
If-Match |
200 (OK) | 200 (OK) |
If-Modified-Since |
304 (Nicht geändert) | 412 (Vorbedingung nicht erfüllt) |
If-None-Match |
304 (Nicht geändert) | 412 (Vorbedingung nicht erfüllt) |
If-Unmodified-Since |
412 (Vorbedingung nicht erfüllt) | 412 (Vorbedingung nicht erfüllt) |
If-Match |
200 (OK) | 412 (Vorbedingung nicht erfüllt) |
Festlegen bedingter Header für Lesevorgänge in Versionen vor 2013-08-15 und für Schreibvorgänge (alle Versionen)
Beachten Sie beim Aufrufen von Blob-Dienst-Lesevorgängen (Blob abrufen und Blobeigenschaften abrufen) mit Versionen vor 2013-08-15 und beim Aufrufen von Schreibvorgängen unabhängig von der Version Folgendes:
Wenn in einer Anforderung sowohl der
If-None-Match
-Header als auch derIf-Modified-Since
-Header angegeben sind, wird die Anforderung auf Grundlage der inIf-None-Match
angegebenen Kriterien ausgewertet.Wenn in einer Anforderung sowohl der
If-Match
-Header als auch derIf-Unmodified-Since
-Header angegeben sind, wird die Anforderung auf Grundlage der inIf-Match
angegebenen Kriterien ausgewertet.Mit Ausnahme der beiden oben angegebenen Kombinationen bedingter Header darf in einer Anforderung nur ein einzelner bedingter Header angegeben werden. Wenn mehrere bedingte Header angegeben werden, wird der Statuscode 400 (
Bad Request
) zurückgegeben.Wenn eine Antwort ein ETag enthält, überprüfen Sie vor dem Verarbeiten des ETags die Version der Anforderung und Antwort. Beispielsweise wird in Version 2011-08-18 und höher ein ETag in Anführungszeichen zurückgegeben, in älteren Versionen jedoch nicht. Stellen Sie vor dem Auswerten des ETags sicher, dass die Anwendung beide ETag-Formate verarbeiten kann.
RFC 2616 lässt mehrere ETag-Werte in einem einzelnen Header zu, aber Anforderungen an den Blob-Dienst können nur einen ETag-Wert enthalten. Wenn mehrere ETag-Werte angegeben werden, wird der Statuscode 400 (
Bad Request
) erzeugt.
Vorgänge, die bedingte Header unterstützen
In der folgenden Tabelle sind die Vorgänge beschrieben, die bedingte Header unterstützen.
REST-Vorgang | Vorgangsart | Unterstützte bedingte Header |
---|---|---|
Append Block (Version 2015-02-21 und höher) |
Schreiben |
If-Modified-Since If-Unmodified-Since If-Match If-None-Match x-ms-if-tags |
Append Block From URL (Version 2018-11-09 und höher) |
Schreiben |
If-Modified-Since If-Unmodified-Since If-Match If-None-Match x-ms-if-tags |
Copy Blob | Lesen und Schreiben | Für Bedingungen für den Ziel-BLOB: - If Modified-Since - If-Unmodified-Since - If-Match - If-None-Match - x-ms-if-tags Für Bedingungen für den Quell-BLOB: - x-ms-source-if-modified-since - x-ms-source-if-unmodified-since - x-ms-source-if-match - x-ms-source-if-none-match - x-ms-source-if-tags |
Delete Blob | Schreiben |
If-Modified-Since If-Unmodified-Since If-Match If-None-Match x-ms-if-tags |
Delete Container | Schreiben |
If-Modified-Since If-Unmodified-Since |
Get Blob | Lesen |
If-Modified-Since If-Unmodified-Since If-Match If-None-Match x-ms-if-tags |
Get Blob Metadata | Lesen |
If-Modified-Since If-Unmodified-Since If-Match If-None-Match x-ms-if-tags |
Get Blob Properties | Lesen |
If-Modified-Since If-Unmodified-Since If-Match If-None-Match x-ms-if-tags |
Abrufen von Blobtags (Version 2019-12-12 und höher) |
Lesen | x-ms-if-tags |
Get Block List | Lesen | x-ms-if-tags |
Get Page Ranges | Lesen |
If-Modified-Since If-Unmodified-Since If-Match If-None-Match x-ms-if-tags |
Lease Blob | Schreiben |
If-Modified-Since If-Unmodified-Since If-Match If-None-Match x-ms-if-tags |
Lease Container | Schreiben |
If-Modified-Since If-Unmodified-Since |
Put Blob From URL | Schreiben |
If-Modified-Since If-Unmodified-Since If-Match If-None-Match Für Bedingungen für den Quell-BLOB: - x-ms-source-If-Modified-Since - x-ms-source-if-Unmodified-Since - x-ms-source-If-Match - x-ms-source-If-None-Match |
Put Blob | Schreiben |
If-Modified-Since If-Unmodified-Since If-Match If-None-Match x-ms-if-tags |
Put Block From URL (Version 2018-03-28 und höher) |
Schreiben |
x-ms-source-If-Modified-Since x-ms-source-If-Unmodified-Since x-ms-source-If-Match x-ms-source-If-None-Match |
Put Block List | Schreiben |
If-Modified-Since If-Unmodified-Since If-Match If-None-Match x-ms-if-tags |
Put Page | Schreiben |
If-Modified-Since If-Unmodified-Since If-Match If-None-Match x-ms-if-tags |
Put Page From URL (Version 2018-11-09 und höher) |
Schreiben |
If-Modified-Since If-Unmodified-Since If-Match If-None-Match x-ms-if-tags |
Set Blob Metadata | Schreiben |
If-Modified-Since If-Unmodified-Since If-Match If-None-Match x-ms-if-tags |
Set Blob Properties | Schreiben |
If-Modified-Since If-Unmodified-Since If-Match If-None-Match x-ms-if-tags |
Set Container ACL | Schreiben |
If-Modified-Since If-Unmodified-Since |
Festlegen von Containermetadaten | Schreiben | If-Modified-Since |
Festlegen von Blobtags (Version 2019-12-12 und höher) |
Schreiben | x-ms-if-tags |
Set Blob Tier | Schreiben | x-ms-if-tags |
Snapshot Blob | Lesen |
If-Modified-Since If-Unmodified-Since If-Match If-None-Match x-ms-if-tags |
Festlegen einer Blob-Unveränderlichkeitsrichtlinie | Schreiben | If-Unmodified-Since |
Bedingte Header werden in den folgenden Datenvorgängen des Blob-Diensts derzeit nicht unterstützt:
HTTP-Antwortcodes für Vorgänge, die bedingte Header unterstützen
Wenn die Anforderung einen bedingten Header enthält und die angeforderte Ressource die angegebene Bedingung nicht erfüllt, gibt der Blob-Dienst einen HTTP-Antwortcode zurück. Die zurückgegebenen Antwortcodes entsprechen der HTTP/1.1-Protokollspezifikation (RFC 2616).
Methoden in der Azure .NET-Clientbibliothek konvertieren diese Fehlerantwortcodes in ein StorageException-Objekt.
Lesevorgänge
In der folgenden Tabelle sind die Antwortcodes angegeben, die bei einem Lesevorgang für die einzelnen bedingten Header zurückgegeben werden, wenn eine Bedingung nicht erfüllt ist. In Lesevorgängen werden die Verben GET und HEAD verwendet.
Bedingter Header | Antwortcode, wenn Bedingung nicht erfüllt wurde |
---|---|
If-Modified-Since |
Nicht geändert (304 (nicht geändert)) |
If-Unmodified-Since |
Vorbedingung nicht erfüllt (412) (Vorbedingung nicht erfüllt)) |
If-Match |
Vorbedingung nicht erfüllt (412) (Vorbedingung nicht erfüllt)) |
If-None-Match |
Nicht geändert (304 (nicht geändert)) |
Die Ergebnisse, die bei Verwendung mehrerer Header mit Version 2013-08-15 oder höher zurückgegebenen werden, können Sie den Beispielen oben entnehmen.
Schreibvorgänge
In der folgenden Tabelle sind die Antwortcodes angegeben, die bei einem Schreibvorgang für die einzelnen bedingten Header zurückgegeben werden, wenn eine Bedingung nicht erfüllt ist. In Schreibvorgängen werden die Verben PUT und DELETE verwendet.
Bedingter Header | Antwortcode, wenn Bedingung nicht erfüllt wurde |
---|---|
If-Modified-Since |
Vorbedingung nicht erfüllt (412) (Vorbedingung nicht erfüllt)) |
If-Unmodified-Since |
Vorbedingung nicht erfüllt (412) (Vorbedingung nicht erfüllt)) |
If-Match |
Vorbedingung nicht erfüllt (412) (Vorbedingung nicht erfüllt)) |
If-None-Match |
Vorbedingung nicht erfüllt (412) (Vorbedingung nicht erfüllt)) |
Kopiervorgänge
In der folgenden Tabelle sind die Antwortcodes angegeben, die bei einem Kopiervorgang für die einzelnen bedingten Header zurückgegeben werden, wenn eine Bedingung nicht erfüllt ist. Der Kopierblobvorgang verwendet die Verben PUT.
Bedingter Header | Antwortcode, wenn Bedingung nicht erfüllt wurde |
---|---|
If-Modified-Since |
Vorbedingung nicht erfüllt (412) (Vorbedingung nicht erfüllt)) |
If-Unmodified-Since |
Vorbedingung nicht erfüllt (412) (Vorbedingung nicht erfüllt)) |
If-Match |
Vorbedingung nicht erfüllt (412) (Vorbedingung nicht erfüllt)) |
If-None-Match |
Vorbedingung nicht erfüllt (412) (Vorbedingung nicht erfüllt)) |
x-ms-source-if-modified-since |
Vorbedingung nicht erfüllt (412) (Vorbedingung nicht erfüllt)) |
x-ms-source-if-unmodified-since |
Vorbedingung nicht erfüllt (412) (Vorbedingung nicht erfüllt)) |
x-ms-source-if-match |
Vorbedingung nicht erfüllt (412) (Vorbedingung nicht erfüllt)) |
x-ms-source-if-none-match |
Vorbedingung nicht erfüllt (412) (Vorbedingung nicht erfüllt)) |
Tags Für bedingte Vorgänge
Zusätzlich zu den standardmäßigen HTTP-bedingten Headern, die vom Blobdienst unterstützt werden, unterstützen mehrere Vorgänge auch Bedingungen für die Tags in einer Blobressource.
Bedingter Header | BESCHREIBUNG |
---|---|
x-ms-if-tags |
Version 2019-12-12 und höher. Ein TagsPredicate -Wert. Geben Sie diesen Header an, um den Vorgang nur auszuführen, wenn das Prädikat mit true den Tags des Blobs ausgewertet wird. |
x-ms-source-if-tags |
Version 2019-12-12 und höher. Gilt nur für Das Kopieren von Blobs. Ein TagsPredicate -Wert. Geben Sie diesen Header an, um den Vorgang nur auszuführen, wenn das Prädikat mit true den Tags des Quellblobs ausgewertet wird. |
Wenn der x-ms-if-tags
bedingte Header oder x-ms-source-if-tags
in einer Anforderung vorhanden ist und der TagsPredicate
als false
ausgewertet wird, gibt der Blobdienst den Fehlercode 412 (Vorbedingung fehlgeschlagen) für den Vorgang zurück.
Der Aufrufer muss über die Berechtigung zum Lesen der Tags in einem Blob verfügen, um die x-ms-if-tags
bedingten Header oder x-ms-source-if-tags
verwenden zu können.
Prädikatsyntax für Tags
Der Blob-Dienst unterstützt eine Teilmenge der ANSI SQL WHERE-Klauselgrammatik für den Wert des TagsPredicate
Headers. Die folgenden Operatoren werden unterstützt:
Operator | BESCHREIBUNG | Beispiel |
---|---|---|
= |
Gleich | Status = 'In Progress' |
<> |
Ungleich | Status <> 'Done' |
> |
Größer als | LastModified > '2018-06-18 20:51:26Z' |
>= |
Größer als oder gleich | Priority >= '05' |
< |
Kleiner als | Age < '032' |
<= |
Kleiner als oder gleich | Reviewer <= 'Smith' |
AND |
Logisches AND | Name > 'C' AND Name < 'D' Age > '032' AND Age < '100' |
OR |
Logisches OR | Status = 'Done' or LastModified > '2018-06-18 20:51:26Z' |
Alle Tagwerte sind Zeichenfolgen, und die unterstützten binären relationalen Operatoren verwenden eine lexikografische Sortierung der Tagwerte. Um Datentypen ohne Zeichenfolgen zu unterstützen, einschließlich Zahlen und Datumsangaben, müssen geeignete Abstände und sortierbare Formatierungen verwendet werden. Tagwerte müssen in einfache Anführungszeichen eingeschlossen werden.
Wenn Tagnamen reguläre SQL-Bezeichner sind, können sie ohne Escapezeichen vorhanden sein. wenn sie Sonderzeichen enthalten, müssen sie durch doppelte Anführungszeichen (z. B. "TagName" = 'TagValue') getrennt werden.
Ausdrücke können Vergleiche für mehrere Tagnamen und -werte enthalten. Klammern ((
und )
) können verwendet werden, um logische Ausdrücke zu gruppieren und die kanonische Reihenfolge der Vorgänge zu steuern. Ein TagsPredicate
kann höchstens zehn (10) logische Vorgänge umfassen.
Der Speicherdienst lehnt jede Anforderung ab, die einen ungültigen Ausdruck mit dem Fehlercode 400 (Ungültige Anforderung) enthält.