【问题标题】:Keep getting old version, even after changing the Default Service Version on azure blob (inorder to set the content disposition header)即使更改了 azure blob 上的默认服务版本,也会继续使用旧版本(为了设置内容处置标头)
【发布时间】:2014-10-17 18:59:43
【问题描述】:

背景:

我试图强制浏览器下载图像以响应按钮(或链接)点击,而不是内联显示。我需要它来跨浏览器工作,所以 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. 从链接调用图像 click\window.open(image_url)\window.location = image_url。 在后台使用提琴手。

问题: 该图像由 IE 显示为内嵌图像。检查提琴手,看看:

  1. 响应头中不存在 contentDisposition。

  2. 响应中的 x-ms-version 不是我设置为默认的那个。我一直在获取旧版本 2009-09-19。

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

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

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

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

【问题讨论】:

  • 在第 2 步之后,您是否在 blob 上调用了 SetProperties() 方法?
  • 是的,当我在请求中发送 x-ms-version(使用提琴手)时,我确实得到了 ContentDisposition 值。

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


【解决方案1】:

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

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

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

你可以尝试两件事:

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

【讨论】:

  • 我真的希望这能解决问题......我回家后会检查它并相应地更新线程。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-04-29
  • 2021-08-25
  • 1970-01-01
  • 1970-01-01
  • 2022-08-04
  • 2017-02-13
  • 1970-01-01
相关资源
最近更新 更多