2015-12-08 78 views
1

我有以下问题。最近我检查了我的网站的Google Pagespeed,并决定将缓存控制设置为我的所有斑点(图像)。更新缓存控制后,Blob内容类型被删除

我这样做后,我注意到,图像响应不包含任何内容类型,已被删除。

这是我的代码的摘录:

public Microsoft.WindowsAzure.StorageClient.CloudBlobContainer container;   
public String cacheControl = "public, max-age=604800"; 
var options = new Microsoft.WindowsAzure.StorageClient.BlobRequestOptions(); 
options.UseFlatBlobListing = true; 

var blobInfos = container.ListBlobs(options); 

foreach (var blobInfo in blobInfos) 
{   
    var blob = container.GetBlobReference(blobInfo.Uri.ToString()); 

    if (blob is Microsoft.WindowsAzure.StorageClient.CloudBlob) 
    { 
     blob.Properties.CacheControl = cacheControl;      
     blob.SetProperties(); 
    } 
} 

你能解释一下为什么吗?

回答

0

这是预期的行为。在设置属性时,任何未定义的属性都将设置为其默认值(即空)。

看着你的代码,你正在创建一个新的CloudBlockBlob对象实例,默认情况下它的所有属性都设置为null(或空字符串),而你只设置了cache-control属性。

您应该简单地将blobInfo转换成CloudBlob并更新其属性,而不是创建CloudBlob的新实例。

我还注意到您正在使用旧版本的存储客户端库。我会建议升级到最新版本。以下是我编写的一些代码,它使用最新版本并执行相同的操作。

static void PreserveProperties() 
    { 
     var account = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true); 
     var blobClient = account.CreateCloudBlobClient(); 
     var container = blobClient.GetContainerReference("images"); 
     var blobs = container.ListBlobs(null, true); 
     foreach (var blob in blobs) 
     { 
      var cloudBlob = blob as Microsoft.WindowsAzure.Storage.Blob.CloudBlob; 
      if (cloudBlob != null) 
      { 
       cloudBlob.Properties.CacheControl = "public, max-age=604800"; 
       cloudBlob.SetProperties(); 
      } 
     } 
    } 
+0

“看着你的代码,你正在创建一个CloudBlockBlob的新实例”哪一行? –

+0

这一个 - 'var blob = container.GetBlobReference(blobInfo.Uri.ToString());'。 HTH。 –

+0

现在有道理!谢谢! –