it-swarm.com.ru

Добавьте заголовки Cache-Control и Expires к BLOB-объектам хранилища Azure.

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

Такие приложения, как CloudXplorer и Cerebrata Cloud Storage Studio предоставляют опции для установки свойств метаданных для контейнеров и больших двоичных объектов, но расстраиваются при попытке добавить Cache-Control.

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

31
Gavin

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

  1. Запуск операции из рабочей роли в том же центре обработки данных. Скорость между службами Azure велика, если они находятся в одной группе привязок. Плюс нет никаких затрат на передачу данных.
  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();
        }
    });
    
23
Joel Fillmore

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

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

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

Приведенный ниже код выполняет отдельную задачу для каждого контейнера, и в каждом контейнере обновляется около 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);
        }
    }
}
9
Jay Borseth

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

Если вы проверите HTTP-заголовки объекта blob с помощью curl, вы увидите заголовок cache-control, возвращенный со значением, которое вы установили.

4
TMC

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

3
mistika

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

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

В этом окне редактирования вы можете настроить управление кэшем, Content Encoding, Content Language и другие.

Примечание: в настоящее время вы не можете редактировать эти данные на портале Azure

1
John Washam

Настройка свойств кэширования элемента управления BLOB-объектов хранилища с помощью сценария 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
frank tan

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

Полное объяснение приведено в Установите контроль кэша BLOB-объектов Azure с помощью сценария 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()
}
0
Tekz