将Cache-Control和Expires标头添加到Azure存储Blob

我正在使用Azure存储来提供静态文件blob,但我希望在提供服务时为文件/ blob添加Cache-Control和Expires标头以降低带宽成本。 像CloudXplorer和Cerebrata的Cloud Storage Studio这样的应用程序提供了在容器和blob上设置元数据属性的选项,但在尝试添加Cache-Control时会感到不安。 有人知道是否可以为文件设置这些标头?     
已邀请:
我不得不在大约600k blob上运行批处理作业,发现了两件真正有用的东西: 从同一数据中心的辅助角色运行操作。只要Azure服务位于同一个关联组中,Azure服务之间的速度就很快。此外,没有数据传输成本。 并行运行操作。 .net v4中的任务并行库(TPL)使这非常简单。下面是为容器中的每个blob并行设置缓存控制头的代码:
// 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();
    }
});
    
这是Joel Fillmore答案的更新版本: Azure现在无需创建网站和使用WorkerRole,而是可以运行“WebJobs”。您可以在存储帐户所在的同一数据中心的网站上按需运行任何可执行文件,以设置缓存标头或任何其他标头字段。 在与存储帐户相同的数据中心中创建一个临时的临时网站。不要担心亲和团体;创建一个空的ASP.NET站点或任何其他简单站点。内容并不重要。 使用下面的代码创建一个控制台程序,该代码使用更新的Azure存储API。编译它以进行发布,然后将可执行文件和所有必需的DLL压缩为.zip文件。 创建WebJob并从步骤#2上载.zip文件。 运行WebJob。写入控制台的所有内容都可以在创建的日志文件中查看,并可从WebJob控制页面访问。 请注意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);
        }
    }
}
    
最新版本的Cerebrata Cloud Storage Studio,v2011.04.23.00,支持在单个blob对象上设置缓存控制。右键单击blob对象,选择“View / Edit Blob Properties”,然后设置
Cache-Control
属性的值。 (例如
public, max-age=2592000
)。 如果使用curl检查blob对象的HTTP头,您将看到返回的缓存控制头与您设置的值。     
最新的CloudBerry Explorer现在支持Cache-Control: http://www.cloudberrylab.com/forum/default.aspx?g=posts&t=3047     
有时,最简单的答案是最好的答案。如果您只想管理少量blob,则可以使用Azure Management更改Blob的标头/元数据。 单击“存储”,然后单击存储帐户名称。 单击容器选项卡,然后单击容器。 单击blob,然后单击屏幕底部的Edit。 在该编辑窗口中,您可以自定义缓存控制,内容编码,内容语言等。 注意:您目前无法从Azure门户编辑此数据     
这可能为时已晚,无法回答,但最近我想以不同的方式做同样的事情,我有图像列表,需要使用powershell脚本进行应用(当然借助Azure存储组件) 希望有人会在将来发现它有用。 使用powershell脚本在Set Azure blob缓存控制中给出完整说明
Add-Type -Path "C:Program FilesMicrosoft SDKsWindows Azure.NET SDKv2.3refMicrosoft.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()
}
    
通过PowerShell脚本设置存储blob缓存控制属性 https://gallery.technet.microsoft.com/How-to-set-storage-blob-4774aca5
#creat CloudBlobClient 
Add-Type -Path "C:Program FilesMicrosoft SDKsWindows Azure.NET SDKv2.3refMicrosoft.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() 
}
    

要回复问题请先登录注册