Azure Storageを使用して静的ファイルBLOBを提供していますが、帯域幅のコストを削減するために、提供時にCache-Control andExpiresヘッダーをファイル/ BLOBに追加したいと思います。
CloudXplorer やCerebrataの Cloud Storage Studio のようなアプリケーションは、コンテナーとBLOBにメタデータプロパティを設定するオプションを提供しますが、Cache-Controlを追加しようとすると動揺します。
これらのヘッダーをファイルに設定できるかどうか誰か知っていますか?
約600kのBLOBでバッチジョブを実行する必要があり、本当に役立つ2つのことがわかりました。
操作を並行して実行します。 .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();
}
});
JoelFillmoreの回答の更新バージョンは次のとおりです。
Webサイトを作成してWorkerRoleを使用する代わりに、Azureで「WebJobs」を実行できるようになりました。ストレージアカウントが配置されているのと同じデータセンターのWebサイトで実行可能ファイルをオンデマンドで実行して、キャッシュヘッダーまたはその他のヘッダーフィールドを設定できます。
以下のコードは、コンテナーごとに個別のタスクを実行し、コンテナーごとに1秒あたり約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オブジェクトを右クリックし、[BLOBプロパティの表示/編集]を選択して、Cache-Control
属性の値を設定します。 (例:public, max-age=2592000
)。
Curlを使用してblobオブジェクトのHTTPヘッダーを確認すると、設定した値で返されるcache-controlヘッダーが表示されます。
時には、最も単純な答えが最良の答えです。少量のBLOBを管理するだけの場合は、 Azure Management を使用して、BLOBのヘッダー/メタデータを変更できます。
その編集ウィンドウで、キャッシュコントロール、コンテンツエンコーディング、コンテンツ言語、 もっと。
最新 CloudBerry Explorer キャッシュコントロールをサポートするようになりました: http://www.cloudberrylab.com/forum/default.aspx?g=posts&t=3047
これは、WindowsAzure.Storagev9.3.3を使用するJoelFillmoreの回答の更新バージョンです。 ListBlobsSegmentedAsyncは5,000のページサイズを返すため、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;
}
PowerShellスクリプトによるストレージBLOBキャッシュ制御プロパティの設定
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()
}
これは答えるには遅すぎるかもしれませんが、最近私は別の方法で同じことをしたいと思っていました。画像のリストがあり、PowerShellスクリプトを使用して適用する必要がありました(もちろんAzureストレージアセンブリの助けを借りて)誰かがこれが役立つことを願っています将来は。
PowerShellスクリプトを使用してAzure BLOBキャッシュ制御を設定する に記載されている完全な説明
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()
}