Agregar encabezados de Control de caché y de caducidad a los Blobs de almacenamiento de Azure


Estoy usando Azure Storage para servir blobs de archivos estáticos, pero me gustaría agregar un encabezado de Control de caché y Caduca a los archivos/blobs cuando se sirven para reducir los costos de ancho de banda.

Aplicaciones como CloudXplorery Cerebrata Cloud Storage Studio dan opciones para establecer propiedades de metadatos en contenedores y blobs, pero se molestan al intentar agregar Control de caché.

Alguien sabe si es posible establecer estos encabezados de archivos?

Author: abatishchev, 2010-12-22

7 answers

Tuve que ejecutar un trabajo por lotes en aproximadamente 600k blobs y encontré 2 cosas que realmente ayudaron:

  1. Ejecutar la operación desde un rol trabajador en el mismo centro de datos. La velocidad entre los servicios de Azure es excelente siempre y cuando estén en el mismo grupo de afinidad. Además, no hay costos de transferencia de datos.
  2. Ejecutando la operación en paralelo. La Biblioteca Paralela de Tareas (TPL) en.net v4 hace que esto sea realmente fácil. Aquí está el código para establecer el encabezado de control de caché para cada blob en un contenedor en paralelo:

    // get the info for every blob in the container
    var blobInfos = cloudBlobContainer.ListBlobs(
        new BlobRequestOptions() { UseFlatBlobListing = true });
    Parallel.ForEach(blobInfos, (blobInfo) =>
    {
        // get the blob properties
        CloudBlob blob = container.GetBlobReference(blobInfo.Uri.ToString());
        blob.FetchAttributes();
    
        // set cache-control header if necessary
        if (blob.Properties.CacheControl != YOUR_CACHE_CONTROL_HEADER)
        {
            blob.Properties.CacheControl = YOUR_CACHE_CONTROL_HEADER;
            blob.SetProperties();
        }
    });
    
 22
Author: Joel Fillmore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-08 17:42:46

Aquí está una versión actualizada de la respuesta de Joel Fillmore:

En lugar de crear un sitio web y usar un WorkerRole, Azure ahora tiene la capacidad de ejecutar "WebJobs". Puede ejecutar cualquier ejecutable bajo demanda en un sitio web en el mismo centro de datos donde se encuentra su cuenta de almacenamiento para establecer encabezados de caché o cualquier otro campo de encabezado.

  1. Cree un sitio web temporal y desechable en el mismo centro de datos que su cuenta de almacenamiento. No se preocupe por los grupos de afinidad; cree un vacío ASP.NET sitio o cualquier otro sitio simple. El contenido no es importante.
  2. Cree un programa de consola utilizando el código siguiente que funciona con las API de almacenamiento de Azure actualizadas. Compilar para la liberación, y luego zip el ejecutable y todos los archivos DLL necesarios en un .archivo zip.
  3. Crea un WebJob y sube el .archivo zip del paso # 2. introduzca la descripción de la imagen aquí
  4. Ejecuta el WebJob. Todo lo escrito en la consola está disponible para ver en el archivo de registro creado y accesible desde el control WebJob pagina.
  5. Tenga en cuenta el método UpdateAzureServiceVersion. Aparentemente, de forma predeterminada, Azure storage ofrece ETags con un formato incorrecto, por lo que es posible que desee ejecutar este código una vez, para obtener más detalles, consulte: this

El siguiente código ejecuta una tarea separada para cada contenedor, y estoy recibiendo aproximadamente 70 encabezados actualizados por segundo por contenedor. Sin cargos de salida.

using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Auth;
using Microsoft.WindowsAzure.Storage.Blob;

namespace AzureHeaders
{
    class Program
    {
        static StorageCredentials storageCredentials =
            new StorageCredentials("azureaccountname", @"azzureaccountkey");
        private static string newCacheSettings = "public, max-age=7776000"; // 3 months
        private static string[] containersToProcess = { "container1", "container2" };

        static void Main(string[] args)
        {
            var account = new CloudStorageAccount(
                storageCredentials,
                false /* useHttps */);

            CloudBlobClient blobClient = account.CreateCloudBlobClient();

            var tasks = new List<Task>();
            foreach (var container in blobClient.ListContainers())
            {
                if (containersToProcess.Contains(container.Name))
                {
                    var c = container;
                    tasks.Add(Task.Run(() => FixHeaders(c)));
                }
            }
            Task.WaitAll(tasks.ToArray());
        }

        private static async Task FixHeaders(CloudBlobContainer cloudBlobContainer)
        {
            int totalCount = 0, updateCount = 0, errorCount = 0;

            Console.WriteLine("Starting container: " + cloudBlobContainer.Name);
            IEnumerable<IListBlobItem> blobInfos = cloudBlobContainer.ListBlobs(useFlatBlobListing: true);

            foreach (var blobInfo in blobInfos)
            {
                try
                {
                    CloudBlockBlob blockBlob = (CloudBlockBlob)blobInfo;
                    var blob = await cloudBlobContainer.GetBlobReferenceFromServerAsync(blockBlob.Name);
                    blob.FetchAttributes();

                    // set cache-control header if necessary
                    if (blob.Properties.CacheControl != newCacheSettings)
                    {
                        blob.Properties.CacheControl = newCacheSettings;
                        blob.SetProperties();
                        updateCount++;
                    }
                }
                catch (Exception ex)
                {
                    // Console.WriteLine(ex.Message);
                    errorCount++;
                }
                totalCount++;
            }
            Console.WriteLine("Finished container: " + cloudBlobContainer.Name + 
                ", TotalCount = " + totalCount + 
                ", Updated = " + updateCount + 
                ", Errors = " + errorCount);
        }

        // http://geekswithblogs.net/EltonStoneman/archive/2014/10/09/configure-azure-storage-to-return-proper-response-headers-for-blob.aspx
        private static void UpdateAzureServiceVersion(CloudBlobClient blobClient)
        {
            var props = blobClient.GetServiceProperties();
            props.DefaultServiceVersion = "2014-02-14";
            blobClient.SetServiceProperties(props);
        }
    }
}
 7
Author: Jay Borseth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-11 20:31:49

La última versión de Cerebrata Cloud Storage Studio, v2011.04.23.00, admite la configuración del control de caché en objetos blob individuales. Haga clic derecho en el objeto blob, elija "Ver/Editar Propiedades Blob" y luego establezca el valor para el atributo Cache-Control. (por ejemplo, public, max-age=2592000).

Si comprueba los encabezados HTTP del objeto blob usando curl, verá el encabezado cache-control devuelto con el valor que estableció.

 4
Author: TMC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-20 06:15:27
 3
Author: mistika,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-14 00:12:41

A veces, la respuesta más simple es la mejor. Si solo desea administrar una pequeña cantidad de blobs, puede usar Azure Management para cambiar los encabezados/metadatos de sus blobs.

  1. Haga clic en Storage, luego haga clic en el nombre de la cuenta de almacenamiento.
  2. Haga clic en la pestaña Containers y, a continuación, haga clic en un contenedor.
  3. Haga clic en un blob, luego haga clic en Editar en la parte inferior de la pantalla.

En esa ventana de edición, puede personalizar el Control de caché, Codificación de Contenido, Content Language , y más.

Nota: actualmente no puede editar estos datos desde Azure Portal

 1
Author: John Washam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-22 14:10:59

Esto podría ser demasiado tarde para responder, pero recientemente quería hacer lo mismo de manera diferente, donde tengo una lista de imágenes y necesitaba aplicar usando el script de powershell (por supuesto, con la ayuda de Azure storage assembly) Espero que alguien encuentre esto útil en el futuro.

Explicación completa dada en Establecer Azure blob cache-control usando powershell script

Add-Type -Path "C:\Program Files\Microsoft SDKs\Windows Azure\.NET SDK\v2.3\ref\Microsoft.WindowsAzure.StorageClient.dll"

$accountName = "[azureaccountname]"
$accountKey = "[azureaccountkey]"
$blobContainerName = "images"

$storageCredentials = New-Object Microsoft.WindowsAzure.StorageCredentialsAccountAndKey -ArgumentList $accountName,$accountKey
$storageAccount = New-Object Microsoft.WindowsAzure.CloudStorageAccount -ArgumentList $storageCredentials,$true
#$blobClient = $storageAccount.CreateCloudBlobClient()
$blobClient =  [Microsoft.WindowsAzure.StorageClient.CloudStorageAccountStorageClientExtensions]::CreateCloudBlobClient($storageAccount)

$cacheControlValue = "public, max-age=604800"

echo "Setting cache control: $cacheControlValue"

Get-Content "imagelist.txt" | foreach {     
    $blobName = "$blobContainerName/$_".Trim()
    echo $blobName
    $blob = $blobClient.GetBlobReference($blobName)
    $blob.Properties.CacheControl = $cacheControlValue
    $blob.SetProperties()
}
 0
Author: Tekz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-08 02:01:17

Set storage blob cache-propiedades de control por script de PowerShell

Https://gallery.technet.microsoft.com/How-to-set-storage-blob-4774aca5

#creat CloudBlobClient 
Add-Type -Path "C:\Program Files\Microsoft SDKs\Windows Azure\.NET SDK\v2.3\ref\Microsoft.WindowsAzure.StorageClient.dll" 
$storageCredentials = New-Object Microsoft.WindowsAzure.StorageCredentialsAccountAndKey -ArgumentList $StorageName,$StorageKey 
$blobClient =   New-Object Microsoft.WindowsAzure.StorageClient.CloudBlobClient($BlobUri,$storageCredentials) 
#set Properties and Metadata 
$cacheControlValue = "public, max-age=60480" 
foreach ($blob in $blobs) 
{ 
  #set Metadata 
  $blobRef = $blobClient.GetBlobReference($blob.Name) 
  $blobRef.Metadata.Add("abcd","abcd") 
  $blobRef.SetMetadata() 

  #set Properties 
  $blobRef.Properties.CacheControl = $cacheControlValue 
  $blobRef.SetProperties() 
}
 0
Author: frank tan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-23 06:01:28