Frage

Ich bin mit Azure Storage statischer Datei Blobs zu dienen, aber ich mag einen Cache-Control hinzufügen und Expires-Header, um die Dateien / Blobs beim Servieren bis zu Bandbreitenkosten zu reduzieren.

Anwendung wie CloudXplorer und Cerebrata der Cloud Storage Studio geben Optionen Satz-Metadaten-Eigenschaften auf Container und Blobs aber aufregen, wenn sie versuchen Cache-Control hinzuzufügen.

Wer weiß, ob es möglich ist, diese Header für Dateien festlegen?

War es hilfreich?

Lösung

Ich hatte einen Batch-Job auf über 600k Blobs laufen und fanden 2 Dinge, die mir sehr geholfen:

  1. Ausführen der Operation von einem Arbeiter Rolle im selben Rechenzentrum. Die Geschwindigkeit zwischen Azure-Diensten ist groß, solange sie in der gleichen Affinitätsgruppe sind. Darüber hinaus gibt es keine Datenübertragungskosten.
  2. Ausführen der Operation parallel. Die Task Parallel Library (TPL) in .net v4 das macht wirklich einfach. Hier ist der Code, den Cache-Control-Header für jeden Klecks in einem Behälter parallel zu setzen:

    // 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();
        }
    });
    

Andere Tipps

Hier ist eine aktualisierte Version von Joel Fillmore Antwort:

Statt der Erstellung einer Website und mit einem WorkerRole, jetzt Azure hat die Fähigkeit, „WebJobs“ zu laufen. Sie können an der gleichen Rechenzentrum auf einer Website beliebige ausführbare Dateien bei Bedarf ausgeführt, wenn Ihr Speicherkonto Satz Cache-Header oder einem anderen Header-Feld befindet.

  1. Erstellen Sie eine Wegwerf-temporäre Website im selben Rechenzentrum als Speicherkonto. Kümmere dich nicht um Affinitätsgruppen; eine leere ASP.NET-Website oder eine andere einfache Website erstellen. Der Inhalt ist unwichtig.
  2. Erstellen Sie ein Konsolenprogramm mit dem Code, unter dem mit der aktualisierten Azure Storage APIs funktioniert. Kompilieren Sie es für die Freigabe und zip dann die ausführbare Datei und alle erforderlichen DLLs in eine ZIP-Datei.
  3. Erstellen Sie eine WebJob und laden Sie die ZIP-Datei von Schritt # 2. eingeben Bild Beschreibung hier
  4. Führen Sie das WebJob. Alles in die Konsole geschrieben steht der Blick in der Protokolldatei erstellt und zugänglich von der WebJob Steuerseite.
  5. Beachten Sie die UpdateAzureServiceVersion Methode. Offenbar standardmäßig dient Azure Storage falsch formatiert ETags so möchten Sie vielleicht einmal diesen Code auszuführen, für Details siehe: dieses

Der folgende Code läuft eine separate Aufgabe für jeden Behälter, und ich bin immer etwa 70 Header pro Sekunde pro Container aktualisiert. Keine Ausstiegskosten.

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);
        }
    }
}

Die neueste Version von Cerebrata Cloud Storage Studio , v2011.04.23.00 , Einstellung unterstützt Cache-Control auf einzelne Objekte BLOB. Rechtsklick auf dem Blob-Objekt, wählen Sie „View / Edit Blob Eigenschaften“ dann den Wert für das Cache-Control Attribut gesetzt. (Z public, max-age=2592000).

Wenn Sie das überprüfen HTTP-Header des Blobs Objekt mit curl, werden Sie den Cache-Control-Header sehen mit dem Wert zurückgegeben Sie gesetzt haben.

Manchmal ist die einfachste Antwort ist die beste. Wenn Sie nur eine kleine Menge von Blobs verwalten möchten, können Sie Azure-Management verwenden die Header / Metadaten für Änderungen Ihre Blobs.

  1. Klicken Sie auf Speicher , dann klicken Sie auf den Speicherkontonamen.
  2. Klicken Sie auf Container Registerkarte, dann klicken Sie auf einen Container.
  3. Klicken Sie auf einen Klecks, dann klicken Sie auf Bearbeiten am unteren Rand des Bildschirms angezeigt.

In diesem Bearbeitungsfenster, können Sie anpassen die Cache Control Content Encoding Content Sprache und vieles mehr.

Hinweis: Sie können derzeit nicht bearbeiten diese Daten aus der

Dies könnte zu spät sein, zu antworten, aber vor kurzem wollte ich das gleiche in anderer Weise zu tun, wo ich Liste der Bilder und benötigen mit Powershell-Skript anwenden (natürlich mit Hilfe von Azure Speicheranordnung) Hoffnung jemand findet diese nützlich in der Zukunft.

Vollständige Erklärung gegeben in Set Azure Blob-Cache-Steuerung mit Powershell-Skript

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()
}

Set Speicher blob Cache-Control-Eigenschaften von Powershell-Skript

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() 
}

Hier ist eine aktualisierte Version von Joel Fillmore Antwort WindowsAzure.Storage v9.3.3 raubend. Beachten Sie, dass ListBlobsSegmentedAsync eine Seitengröße von 5000 zurück, weshalb die BlobContinuationToken verwendet wird.

    public async Task BackfillCacheControlAsync()
    {
        var container = await GetCloudBlobContainerAsync();
        BlobContinuationToken continuationToken = null;

        do
        {
            var blobInfos = await container.ListBlobsSegmentedAsync(string.Empty, true, BlobListingDetails.None, null, continuationToken, null, null);
            continuationToken = blobInfos.ContinuationToken;
            foreach (var blobInfo in blobInfos.Results)
            {
                var blockBlob = (CloudBlockBlob)blobInfo;
                var blob = await container.GetBlobReferenceFromServerAsync(blockBlob.Name);
                if (blob.Properties.CacheControl != "public, max-age=31536000")
                {
                    blob.Properties.CacheControl = "public, max-age=31536000";
                    await blob.SetPropertiesAsync();
                }
            }               
        }
        while (continuationToken != null);
    }

    private async Task<CloudBlobContainer> GetCloudBlobContainerAsync()
    {
        var storageAccount = CloudStorageAccount.Parse(_appSettings.AzureStorageConnectionString);
        var blobClient = storageAccount.CreateCloudBlobClient();
        var container = blobClient.GetContainerReference("uploads");
        return container;
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top