即使在更改azure blob上的默认服务版本后,也要继续使用旧版本(为了设置内容处置标头)

时间:2014-08-24 13:23:00

标签: c# azure azure-storage-blobs content-disposition

背景

我试图强制浏览器下载图片以响应按钮(或链接)点击,而不是内联显示。我需要这个才能跨浏览器工作,所以HTML5属性还不够。

图像存储在blob(天蓝色存储服务)中。

我尝试了什么:

  1. 要将DefaultServiceVersion设置为2013-08-15,以便contentDisposition可以正常工作。 (示例来自Azure Storage API ContentDisposition):

    var cloudStorageAccount = new CloudStorageAccount(new StorageCredentials("accountname", "accountkey"), false);
    var serviceProperties = cloudStorageAccount.CreateCloudBlobClient().GetServiceProperties();
    serviceProperties.DefaultServiceVersion = "2013-08-15";
    cloudStorageAccount.CreateCloudBlobClient().SetServiceProperties(serviceProperties);
    
  2. 设置内容处理属性(例如http://www.tuicool.com/articles/AFbmY3):

    blob.Properties.ContentDisposition = "attachment; filename=" + downloadName;
    
  3. 要从链接调用图像,请单击\ window.open(image_url)\ window.location = image_url。 随着背景中的提琴手。

  4. 问题: IE将图像显示为内嵌图像。检查提琴手并看到:

    1. contentDisposition不存在于响应标头中。

    2. 响应中的x-ms-version不是我设置的默认版本。我继续使用旧版本2009-09-19。

    3. 所以我也尝试直接从fiddler生成请求,请求header中指定了x-ms-version。这确实有效,我正在获得我期望的响应,使用contentDisposition属性和正确的x-ms-version(我添加到请求中的那个 - 2013-08-15)。

      我理解问题出在默认服务版本上,当我检查(调试时)DefaultServiceVersion属性的值时,我确实看到了正确的值(2013-08-15),但响应仍包含旧值

      在从链接(或从window.open)生成请求时,我无法将x-ms-version添加到标题中,而且我真的不明白为什么我添加的默认值不是&#39工作。

      提前感谢您提供任何帮助或建议如何解决此问题。

1 个答案:

答案 0 :(得分:3)

我想我知道发生了什么。请查看以下链接:http://msdn.microsoft.com/en-us/library/azure/dd894041.aspx(转到标题为:Requests Via Anonymous Access的部分)

  

如果对Blob服务的请求未指定x-ms-version   标头,并且尚未使用设置服务的默认版本   设置Blob服务属性,然后是最早版本的Blob   service用于处理请求。 但是,如果容器是   使用版本执行Set Container ACL操作公开   2009-09-19或更新版本,然后使用版本处理请求   2009-09-19

您很可能在更改服务版本之前创建了容器或更改了它的ACL,因此如果没有提供服务版本,则使用旧版本。

您可以尝试两件事:

  1. 创建一个新的blob容器,其ACL为public,并尝试从那里下载blob。由于容器是使用新服务版本创建的,因此不应遇到此错误。
  2. 将容器ACL更改为Private,然后将其更改回Public。由于现在使用最新版本的库执行操作(我假设),下载blob时不应该遇到此错误。