In Cache-Control und Expires Header Azure Storage Blobs
-
12-10-2019 - |
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?
Lösung
Ich hatte einen Batch-Job auf über 600k Blobs laufen und fanden 2 Dinge, die mir sehr geholfen:
- 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.
-
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.
- 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.
- 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.
- Erstellen Sie eine WebJob und laden Sie die ZIP-Datei von Schritt # 2.
- Führen Sie das WebJob. Alles in die Konsole geschrieben steht der Blick in der Protokolldatei erstellt und zugänglich von der WebJob Steuerseite.
- 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.
Aktuelle Cloudberry Explorer unterstützt nun Cache-Control: http://www.cloudberrylab.com/forum/default.aspx?g = Beiträge & t = 3047
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.
- Klicken Sie auf Speicher , dann klicken Sie auf den Speicherkontonamen.
- Klicken Sie auf Container Registerkarte, dann klicken Sie auf einen Container.
- 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;
}