Добавить контроль в кешах и истекать заголовки в Blobs Azure

StackOverflow https://stackoverflow.com/questions/4507657

Вопрос

Я использую Azure Storage, чтобы обслуживать статические файловые сечения, но я хотел бы добавить контроль от кеша и истекать в заголовок в файлы/каждые каждые, когда их обслуживают, чтобы снизить затраты на пропускную способность.

Применение как Cloudxplorer и церебраты Облачная студия хранения Дайте параметры для установки свойств метаданных на контейнерах и капли, но при попытке добавить контроль от кеша.

Кто -нибудь знает, можно ли установить эти заголовки для файлов?

Это было полезно?

Решение

Мне пришлось запустить партийную работу на 600 тысячах каплей и нашел 2 вещи, которые действительно помогли:

  1. Запуск операции из рабочей роли в одном и том же центре обработки данных. Скорость между Azure Services великолепна, если они находятся в одной и той же группе с аффинностью. Плюс нет затрат на передачу данных.
  2. Запуск операции параллельно. Параллельная библиотека задачи (TPL) в .NET V4 делает это действительно простым. Вот код, чтобы установить заголовок контроля кэша для каждой капли в контейнере параллельно:

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

Другие советы

Вот обновленная версия ответа Джоэла Филлмора:

Вместо того, чтобы создавать веб -сайт и использовать Workerrole, Azure теперь имеет возможность запустить «веб -суть». Вы можете запустить любой исполняемый файл по требованию на веб -сайте в том же обработке обработки данных, где находится ваша учетная запись хранения, чтобы установить заголовки кэша или любое другое поле заголовка.

  1. Создайте бросок, временный веб-сайт в том же обработке обработки данных в качестве учетной записи хранения. Не беспокойтесь о группах с аффинностью; Создайте пустой сайт ASP.NET или любой другой простой сайт. Содержание неважно.
  2. Создайте консольную программу, используя приведенный ниже код, который работает с обновленными API хранилища Azure. Скомпилируйте его для выпуска, а затем застегивайте исполняемый файл и все требуют DLLS в файл .zip.
  3. Создайте WebJob и загрузите файл .zip с шага № 2.enter image description here
  4. Запустите WebJob. Все, что записано на консоли, доступно для просмотра в файле журнала, созданного и доступного на странице управления WebJob.
  5. Обратите внимание на метод Updateazureserviceversion. По -видимому, по умолчанию хранилище Azure служит неправильно отформатированным ETAGS, так что вы можете запустить этот код один раз, для получения подробной информации см. это

Приведенный ниже код выполняет отдельную задачу для каждого контейнера, и я получаю около 70 заголовков, обновленных за секунду на контейнер. Нет выходных обвинений.

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

Последняя версия Cerebrata Cloud Storage Studio, V2011.04.23.00, поддерживает установку контроля кеша на отдельных объектах Blob. Щелкните правой кнопкой мыши объект Blob, выберите «Просмотр/редактирование свойств блоба», затем установите значение для Cache-Control атрибут. (например public, max-age=2592000).

Если вы проверете заголовки HTTP объекта Blob с помощью Curl, вы увидите заголовок контроля кэша, возвращаемый с установленным вами значением.

Последний CloudBerry Explorer теперь поддерживает контроль от кеша:http://www.cloudberrylab.com/forum/default.aspx?g=posts&t=3047

Иногда самый простой ответ - лучший. Если вы просто хотите управлять небольшим количеством пятен, вы можете использовать Управление Azure Чтобы изменить заголовки/метаданные для ваших каплей.

  1. Нажмите на Хранилище, затем нажмите на имя учетной записи хранения.
  2. Нажмите Контейнеры Вкладка, затем нажмите на контейнер.
  3. Нажмите на каплей, затем нажмите Редактировать внизу экрана.

В этом окне редактирования вы можете настроить Управление кешем, Контент кодирование, Контент, и более.

Примечание: В настоящее время вы не можете редактировать эти данные из Портал лазурного

Это может быть слишком поздно, чтобы ответить, но недавно я хотел сделать то же самое по -разному, где у меня есть список изображений, и мне нужно было применять сценарий PowerShell (конечно в будущем.

Полное объяснение, приведенное в Установите управление кешами Azure Blob с помощью скрипта PowerShell

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

Установите свойства управления кешами каша

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

Вот обновленная версия ответа Джоэла Филлмора, потребляющего Windowsazure.storage v9.3.3. Обратите внимание, что ListBlobssementedAsync возвращает размер страницы 5000, поэтому используется BlobContinuationToken.

    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;
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top