Put Page From URL

L'operazione Put Page From URL scrive un intervallo di pagine in un BLOB di pagine in cui il contenuto viene letto da un URL. Questa API è disponibile a partire dalla versione 2018-11-09.

Richiesta

La richiesta Put Page From URL può essere costruita come segue. È consigliato il protocollo HTTPS. Sostituire myaccount con il nome dell'account di archiviazione:

URI della richiesta del metodo PUT Versione HTTP
https://myaccount.blob.core.windows.net/mycontainer/myblob?comp=page HTTP/1.1

URI del servizio di archiviazione emulato

Quando si effettua una richiesta nel servizio di archiviazione emulato, specificare il nome host dell'emulatore e la porta del servizio Blob come 127.0.0.1:10000, seguiti dal nome dell'account di archiviazione emulato:

URI della richiesta del metodo PUT Versione HTTP
http://127.0.0.1:10000/devstoreaccount1/mycontainer/myblob?comp=page HTTP/1.1

Per altre informazioni, vedere Uso del Archiviazione di Azure Emulator per sviluppo e test.

Parametri dell'URI

Nell'URI richiesta è possibile specificare i seguenti parametri aggiuntivi.

Parametro Descrizione
timeout Facoltativa. Il parametro timeout viene espresso in secondi. Per altre informazioni, vedere Impostazione dei timeout per le operazioni del servizio BLOB.

Intestazioni richiesta

Nella seguente tabella vengono descritte le intestazioni di richiesta obbligatorie e facoltative.

Intestazione della richiesta Descrizione
Authorization Obbligatorio. Specifica lo schema di autorizzazione, il nome dell'account e la firma. Per altre informazioni, vedere Autorizzare le richieste a Archiviazione di Azure.
Date o x-ms-date Obbligatorio. Specifica la data per la richiesta nel fuso orario UTC (Coordinated Universal Time). Per altre informazioni, vedere Autorizzare le richieste a Archiviazione di Azure.
x-ms-version Obbligatorio per tutte le richieste autorizzate. Specifica la versione dell'operazione da usare per questa richiesta. Per altre informazioni, vedere Controllo delle versioni per i servizi di Archiviazione di Azure.
Range Range o x-ms-range è obbligatorio.

Specifica l'intervallo di byte da scrivere come pagina. È necessario specificare l'inizio e la fine dell'intervallo. Questa intestazione è definita dalla specifica del protocollo HTTP/1.1.

Per un'operazione di aggiornamento della pagina, l'intervallo di pagine può avere dimensioni fino a 4 MiB.

Considerando che le pagine devono essere allineate a limiti di 512 byte, l'offset iniziale deve essere un modulo di 512, mentre quello finale deve essere un modulo di 512 – 1. Esempi di intervalli di byte validi sono 0-511, 512-1023 e così via.

Il servizio Blob accetta solo un singolo intervallo in byte per l'intestazione Range e l'intervallo di byte deve essere specificato nel formato seguente: bytes=startByte-endByte.

Se Range e x-ms-range sono entrambi specificati, il servizio usa il valore di x-ms-range. Per altre informazioni, vedere Specifica dell'intestazione di intervallo per le operazioni del servizio BLOB .
x-ms-range Range o x-ms-range è obbligatorio.

Specifica l'intervallo di byte da scrivere come pagina. È necessario specificare l'inizio e la fine dell'intervallo. Questa intestazione è definita dalla specifica del protocollo HTTP/1.1.

L'intervallo di pagine può avere dimensioni fino a 4 MiB.

Considerando che le pagine devono essere allineate a limiti di 512 byte, l'offset iniziale deve essere un modulo di 512, mentre quello finale deve essere un modulo di 512 – 1. Esempi di intervalli di byte validi sono 0-511, 512-1023 e così via.

Il servizio Blob accetta solo un singolo intervallo in byte per l'intestazione x-ms-range e l'intervallo di byte deve essere specificato nel formato seguente: bytes=startByte-endByte.

Se Range e x-ms-range sono entrambi specificati, il servizio usa il valore di x-ms-range. Per altre informazioni, vedere Specifica dell'intestazione di intervallo per le operazioni del servizio BLOB .
Content-Length Obbligatorio. Specifica il numero di byte trasmessi nel corpo della richiesta. Il valore di questa intestazione deve essere impostato su zero. Quando la lunghezza non è zero, l'operazione avrà esito negativo con il codice di stato 400 (richiesta non valida).
x-ms-copy-source:name Obbligatorio. Specifica l'URL del BLOB di origine. Il valore può essere un URL di lunghezza massima di 2 KiB che specifica un BLOB. La codifica del valore deve essere di tipo URL in quanto viene visualizzato in un URI di richiesta. Il BLOB di origine deve essere pubblico o deve essere autorizzato tramite una firma di accesso condiviso. Se il BLOB di origine è pubblico, non è necessaria alcuna autorizzazione per eseguire l'operazione. Ecco alcuni esempi di URL oggetto di origine:

- https://myaccount.blob.core.windows.net/mycontainer/myblob
- https://myaccount.blob.core.windows.net/mycontainer/myblob?snapshot=<DateTime>
- https://myaccount.blob.core.windows.net/mycontainer/myblob?versionid=<DateTime>
x-ms-copy-source-authorization: <scheme> <signature> facoltativo. Specifica lo schema di autorizzazione e la firma per l'origine di copia. Per altre informazioni, vedere Autorizzare le richieste a Archiviazione di Azure.
Per Azure Active Directory è supportato solo il bearer di schema.
Questa intestazione è supportata nelle versioni 2020-10-02 e successive.
x-ms-source-range Carica i byte del BLOB nell'URL di origine nell'intervallo specificato. È necessario specificare l'inizio e la fine dell'intervallo. Questa intestazione è definita dalla specifica del protocollo HTTP/1.1.

L'intervallo di pagine può avere dimensioni fino a 4 MiB.

Il servizio Blob accetta solo un singolo intervallo in byte per l'intestazione x-ms-source-range e l'intervallo di byte deve essere specificato nel formato seguente: bytes=startByte-endByte.

Per altre informazioni, vedere Specifica dell'intestazione di intervallo per le operazioni del servizio BLOB .
x-ms-source-content-md5 facoltativo. Hash MD5 del contenuto della pagina dall'URI. Questo hash viene usato per verificare l'integrità della pagina durante il trasporto dei dati dall'URI. Quando questa intestazione viene specificata, il servizio di archiviazione confronta l'hash del contenuto che è arrivato dall'origine di copia con questo valore di intestazione.

Si noti che questo hash md5 non viene archiviato con il BLOB.

Se i due hash non corrispondono, l'operazione ha esito negativo e restituisce il codice di errore 400 (Richiesta non valida).
x-ms-source-content-crc64 facoltativo. Hash CRC64 del contenuto della pagina dall'URI. Questo hash viene usato per verificare l'integrità della pagina durante il trasporto dei dati dall'URI. Quando questa intestazione viene specificata, il servizio di archiviazione confronta l'hash del contenuto che è arrivato dall'origine di copia con questo valore di intestazione.

Si noti che questo hash CRC64 non viene archiviato con il BLOB.

Se i due hash non corrispondono, l'operazione ha esito negativo e restituisce il codice di errore 400 (Richiesta non valida).

Se sono presenti intestazioni x-ms-source-content-md5 e x-ms-source-content-crc64 , la richiesta avrà esito negativo con una richiesta 400 (richiesta non valida).

Questa intestazione è supportata nelle versioni 2019-02-02 o successive.
x-ms-lease-id:<ID> Obbligatoria se il Blob presenta un lease attivo. Per eseguire questa operazione su un Blob con un lease attivo, specificare l'ID lease valido per questa intestazione.
x-ms-if-sequence-number-le: <num> facoltativo. Se il numero di sequenza del Blob è minore o uguale al valore specificato, la richiesta continua. In caso contrario, avrà esito negativo e verrà restituito l'errore SequenceNumberConditionNotMet (codice di stato HTTP 412 - Condizione preliminare non riuscita).
x-ms-if-sequence-number-lt: <num> facoltativo. Se il numero di sequenza del Blob è minore al valore specificato, la richiesta continua. In caso contrario, avrà esito negativo e verrà restituito l'errore SequenceNumberConditionNotMet (codice di stato HTTP 412 - Condizione preliminare non riuscita).
x-ms-if-sequence-number-eq: <num> facoltativo. Se il numero di sequenza del Blob è uguale al valore specificato, la richiesta continua. In caso contrario, avrà esito negativo e verrà restituito l'errore SequenceNumberConditionNotMet (codice di stato HTTP 412 - Condizione preliminare non riuscita).
If-Modified-Since facoltativo. Valore DateTime. Specificare questa intestazione condizionale per scrivere la pagina solo se il Blob è stato modificato dopo la data e l'ora specificate. Se il Blob non è stato modificato, il servizio Blob restituisce il codice di stato 412 (Condizione preliminare non riuscita).
If-Unmodified-Since facoltativo. Valore DateTime. Specificare questa intestazione condizionale per scrivere la pagina solo se il Blob non è stato modificato dopo la data e l'ora specificate. Se il Blob è stato modificato, il servizio Blob restituisce il codice di stato 412 (Condizione preliminare non riuscita).
If-Match facoltativo. Valore ETag. Specificare un valore ETag per questa intestazione condizionale per scrivere la pagina solo se il valore ETag del Blob corrisponde al valore specificato. Se i valori non corrispondono, il servizio Blob restituisce il codice di stato 412 (Condizione preliminare non riuscita).
If-None-Match facoltativo. Valore ETag.

Specificare un valore ETag per questa intestazione condizionale per scrivere la pagina solo se il valore ETag del Blob non corrisponde al valore specificato. Se i valori sono identici, tramite il servizio Blob viene restituito il codice di stato 412 (Condizione preliminare non riuscita).
x-ms-encryption-scope facoltativo. Indica l'ambito di crittografia da usare per crittografare il contenuto di origine. Questa intestazione è supportata nelle versioni 2019-02-02 o successive.
x-ms-client-request-id facoltativo. Fornisce un valore opaco generato dal client con un limite di 1 kiB registrato nei log di analisi quando è abilitata la registrazione dell'analisi di archiviazione. L'uso di questa intestazione è consigliato per la correlazione delle attività lato client con le richieste ricevute dal server. Per altre informazioni, vedere Informazioni sulla registrazione di Analisi archiviazione e registrazione di Azure: uso dei log per tenere traccia delle richieste di Archiviazione.

Questa operazione supporta l'utilizzo delle intestazioni condizionali per eseguire l'operazione solo se viene soddisfatta una determinata condizione. Per altre informazioni, vedere Specifica di intestazioni condizionali per le operazioni del servizio BLOB.

Intestazioni di richiesta (chiavi di crittografia fornite dal cliente)

A partire dalla versione 2019-02-02, è possibile specificare le intestazioni seguenti nella richiesta per crittografare un BLOB crittografato con una chiave fornita dal cliente. La crittografia con una chiave fornita dal cliente (e il set corrispondente di intestazioni) è facoltativa.

Intestazione della richiesta Descrizione
x-ms-encryption-key Obbligatorio. Chiave di crittografia AES-256 con codifica Base64.
x-ms-encryption-key-sha256 Obbligatorio. Hash SHA256 con codifica Base64 della chiave di crittografia.
x-ms-encryption-algorithm: AES256 Obbligatorio. Specifica l'algoritmo da utilizzare per la crittografia. Il valore di questa intestazione deve essere AES256.

Corpo della richiesta

Il corpo della richiesta contiene il contenuto della pagina.

Richiesta di esempio

  
Request Syntax:  
PUT https://myaccount.blob.core.windows.net/mycontainer/myblob?comp=page HTTP/1.1  
  
Request Headers:   
x-ms-date: Fri, 16 Sep 2011 22:15:50 GMT  
x-ms-version: 2018-11-09  
x-ms-range: bytes=0-65535  
x-ms-copy-source: https://myaccount.blob.core.windows.net/mycontainer/myblob
x-ms-source-range: bytes=0-65535
Authorization: SharedKey myaccount:4KdWDiTdA9HmIF9+WF/8WfYOpUrFhieGIT7f0av+GEI=  
Content-Length: 0  
  

Risposta

Nella risposta sono inclusi un codice di stato HTTP e un set di intestazioni per la risposta.

Codice di stato

Un'operazione completata correttamente restituisce il codice di stato 201 (Creato).

Per informazioni sui codici di stato, vedere Codici di stato e di errore.

Intestazioni della risposta

Nella risposta per questa operazione sono incluse le intestazioni riportate di seguito; inoltre, possono essere incluse intestazioni HTTP standard aggiuntive. Tutte le intestazioni standard sono conformi alla specifica del protocollo HTTP/1.1.

Sintassi Descrizione
ETag Valore ETag per il Blob. Se la versione della richiesta è 2011-08-18 o successive, il valore ETag sarà racchiuso tra virgolette. Il valore ETag può essere utilizzato per eseguire un'operazione Put Page From URL condizionale specificando il relativo valore per l'intestazione della richiesta If-Match o If-None-Match.
Last-Modified Data e ora dell'ultima modifica del BLOB. Il formato data è conforme a RFC 1123. Per altre informazioni, vedere Rappresentazione dei valori di Date-Time nelle intestazioni.

Qualsiasi operazione di scrittura sul Blob, inclusi aggiornamenti dei metadati o delle proprietà del Blob, comporta la modifica dell'ora dell'ultima modifica del Blob.
Content-MD5 Questa intestazione viene restituita in modo che il client possa verificare l'integrità del contenuto del messaggio. Il valore di questa intestazione viene calcolato dal servizio Blob e non è necessariamente lo stesso valore specificato nelle intestazioni della richiesta. Per le versioni 2019-02-02 o successive, questa intestazione viene restituita solo quando la richiesta ha questa intestazione.
x-ms-content-crc64 Per le versioni 2019-02-02 o successive, questa intestazione viene restituita in modo che il client possa verificare l'integrità del contenuto del messaggio. Il valore di questa intestazione viene calcolato dal servizio Blob e non è necessariamente lo stesso valore specificato nelle intestazioni della richiesta.

Questa intestazione viene restituita quando x-ms-source-content-md5 l'intestazione non è presente nella richiesta.
x-ms-blob-sequence-number Numero di sequenza corrente per il Blob di pagine.
x-ms-request-id Questa intestazione identifica in modo univoco la richiesta effettuata e può essere usata per risolvere i problemi relativi alla richiesta. Per altre informazioni, vedere Risoluzione dei problemi relativi alle operazioni API.
x-ms-version Indica la versione del servizio Blob usata per eseguire la richiesta. Questa intestazione viene restituita per le richieste effettuate nella versione 2009-09-19 e successive.
Date Valore data/ora UTC generato dal servizio che indica l'ora in cui è stata avviata la risposta.
x-ms-request-server-encrypted: true/false Versione 2015-12-11 o successiva. Il valore di questa intestazione è impostato su true se il contenuto della richiesta viene crittografato correttamente usando l'algoritmo specificato e false in caso contrario.
x-ms-encryption-key-sha256 Versione 2019-02-02 o successiva. Questa intestazione viene restituita se la richiesta ha usato una chiave fornita dal cliente per la crittografia, in modo che il client possa garantire che il contenuto della richiesta venga crittografato correttamente usando la chiave fornita.
x-ms-encryption-scope Versione 2019-02-02 o successiva. Questa intestazione viene restituita se la richiesta ha usato un ambito di crittografia, in modo che il client possa assicurarsi che il contenuto della richiesta venga crittografato correttamente usando l'ambito di crittografia.
x-ms-client-request-id Questa intestazione può essere usata per risolvere i problemi relativi alle richieste e alle risposte corrispondenti. Il valore di questa intestazione è uguale al valore dell'intestazione x-ms-client-request-id se è presente nella richiesta e il valore è al massimo 1024 caratteri ASCII visibili. Se l'intestazione x-ms-client-request-id non è presente nella richiesta, questa intestazione non sarà presente nella risposta.

Corpo della risposta

Nessuno.

Risposta di esempio

Response Status:  
HTTP/1.1 201 Created  
  
Response Headers:  
Transfer-Encoding: chunked  
x-ms-content-crc64: 77uWZTolTHU  
Date: Sun, 25 Sep 2011 22:33:35 GMT  
ETag: "0x8CB171BA9E94B0B"  
Last-Modified: Sun, 25 Sep 2011 12:13:31 GMT  
x-ms-version: 2011-08-18  
x-ms-blob-sequence-number: 0  
Content-Length: 0  
Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0  
  

Autorizzazione

Questa operazione può essere chiamata dal proprietario dell'account e da qualsiasi altro utente che utilizza una firma di accesso condiviso con l'autorizzazione di scrittura per il Blob o il contenitore.

Commenti

Tramite l'operazione Put Page From URL viene scritto un intervallo di pagine in un Blob di pagine. Questa operazione può essere chiamata solo su un Blob di pagine esistente. Non può essere chiamata per creare un nuovo Blob di pagine, né su un Blob in blocchi. Se si chiama Put Page From URL con un nome di Blob che non esiste, viene restituito l'errore BlobNotFound (codice di stato HTTP 404 - Non trovato).

Nella versione 2020-10-02 e successive Azure Active Directory'autorizzazione è supportata per l'origine dell'operazione di copia.

Per creare un nuovo BLOB di pagine, chiamare Put BLOB e specificare il tipo di BLOB da creare come BLOB di pagine. Un BLOB di pagine può avere dimensioni fino a 8 TiB.

Se il Blob presenta un lease attivo, il client deve specificare un ID lease valido nella richiesta per scrivere una pagina.

Operazioni di aggiornamento di pagine

La chiamata Put Page From URL esegue una scrittura sul posto nel BLOB di pagine specificato. Il contenuto della pagina specificata viene sovrascritto con l'aggiornamento.

Importante

Se si verifica un timeout del server o la connessione viene chiusa durante Put Page From URL, l'aggiornamento della pagina potrebbe anche non venire completato. È pertanto consigliabile tentare l'aggiornamento finché non si riceve una risposta che indica l'esito positivo.

Ogni intervallo di pagine inviate con Put Page From URL per un'operazione di aggiornamento può avere dimensioni fino a 4 MiB. L'inizio e la fine dell'intervallo di pagine devono essere allineati al limite di 512 byte. Se si tenta di caricare un intervallo di pagine di dimensioni superiori a 4 MB, il servizio restituisce il codice di stato 413 (Entità della richiesta troppo grande).

Gestione dei problemi di concorrenza

Il servizio Blob gestisce le scritture simultanee su pagine sovrapposte in modo sequenziale: l'ultima pagina elaborata dal servizio determina il contenuto del Blob. Di conseguenza, per garantire l'integrità del contenuto del Blob, il client deve gestire le scritture sulle pagine sovrapposte utilizzando uno o più dei modi seguenti:

  • È possibile controllare il valore dell'intestazione della risposta Last-Modified per ogni chiamata completata a Put Page From URL. L'ordine delle risposte restituite dal servizio Blob non corrisponde necessariamente all'ordine in cui sono state eseguite dal servizio. Tuttavia, il valore di Last-Modified indica sempre l'ordine in cui il servizio ha elaborato le richieste.

  • È possibile eseguire gli aggiornamenti in modo condizionale in base al valore ETag del Blob o all'ora dell'ultima modifica utilizzando la concorrenza ottimistica. Questo approccio è la soluzione appropriata se il numero di scritture simultanee è relativamente basso. Utilizzare le intestazioni di richiesta condizionali If-Match, If-None-Match, If-Modified-Since e If-Unmodified-Since a questo scopo.

  • È possibile chiamare lease BLOB per bloccare il BLOB su altre scritture per un periodo di un minuto o più se il lease viene rinnovato.

  • È possibile utilizzare il numero di sequenza del Blob per assicurarsi che il nuovo tentativo di effettuare una richiesta che non ha ricevuto risposta non comporti aggiornamenti simultanei. Questo approccio è da preferire per i client che richiedono una velocità effettiva elevata per la scrittura di pagine. Viene descritto in dettaglio nella sezione seguente.

Utilizzo del numero di sequenza del Blob di pagine per ritentare le richieste

Quando si verifica il timeout di una chiamata a Put Page From URL o non viene restituita alcuna risposta, non è possibile sapere con certezza se la richiesta ha avuto esito positivo. È pertanto necessario ritentare la richiesta, tuttavia, a causa della natura distribuita dei servizi di archiviazione di Azure, è possibile che la richiesta originale venga elaborata dopo che la nuova richiesta ha avuto esito positivo. La richiesta originale ritardata può sovrascrivere altri aggiornamenti e restituire un risultato imprevisto. Nella sequenza seguente viene illustrata questa situazione:

  1. Si verifica il timeout di una richiesta Put Page From URL per scrivere il valore "X" sulla pagina 0 oppure non viene restituita alcuna risposta.

  2. Una nuova richiesta per scrivere il valore "X" sulla pagina 0 ha esito positivo.

  3. Una richiesta per scrivere il valore "Y" sulla pagina 0 ha esito positivo.

  4. La richiesta originale ha esito positivo, quindi viene scritto il valore "X" sulla pagina 0.

  5. La lettura della pagina 0 restituisce il valore "X", anche se il client a questo punto si aspettava il valore "Y".

Questo tipo di conflitto può verificarsi quando la richiesta originale non restituisce un codice di stato compreso tra 100-499, ovvero 503 (Server occupato). Se viene restituito uno di questi codici di stato, si può sapere con sicurezza se la richiesta ha avuto esito positivo o negativo. Se invece il servizio restituisce un codice di stato non compreso in questo intervallo, non vi è modo di conoscere lo stato della richiesta originale.

Per evitare questo tipo di conflitto, è possibile utilizzare il numero di sequenza del Blob di pagine per assicurarsi che quando si ritenta una richiesta, la richiesta originale non avrà esito positivo in un momento successivo. A tale scopo, incrementare il numero di sequenza prima di ritentare la richiesta originale. È quindi possibile utilizzare le intestazioni condizionali del numero di sequenza per assicurarsi che la richiesta abbia esito negativo se il relativo numero di sequenza non corrisponde a quello previsto. Nella sequenza seguente viene illustrato questo approccio:

  1. Il client crea un BLOB di pagine con Put BLOB e imposta il numero di sequenza su 0.

  2. Una Put Page From URL richiesta di scrittura del valore "X" nella pagina 0 con l'intestazione if-sequence-number-lt impostata su 1 timeout o non restituisce una risposta.

  3. Il client chiama Set Blob Properties per aggiornare il numero di sequenza a 1.

  4. Richiesta ritentata di scrivere il valore "X" nella pagina 0 con if-sequence-number-lt impostato su 2 riuscito.

  5. Richiesta di scrittura del valore "Y" nella pagina 0 con if-sequence-number-lt impostato su 2 succeeds.

  6. La richiesta originale viene infine elaborata, ma ha esito negativo perché specifica la condizione che il numero di sequenza deve essere minore di 1, ovvero l'intestazione if-sequence-num-lt è impostata su 1. L'errore è SequenceNumberConditionNotMet (codice di stato HTTP 412 – Condizione preliminare non riuscita).

  7. La lettura della pagina 0 restituisce il valore "Y" previsto.

Vedere anche

Autorizzare le richieste a Archiviazione di Azure
Codici di stato e di errore
Impostazione dei timeout per le operazioni del servizio Blob