【问题标题】:Do HTTP RANGE headers work with Azure Blob Storage Shared Access Signatures?HTTP RANGE 标头是否适用于 Azure Blob 存储共享访问签名?
【发布时间】:2013-06-28 20:05:36
【问题描述】:

我正在使用 Azure Blob 存储来存储媒体文件并使用共享访问签名提供对这些文件的访问;在这方面一切都很好。

但是,我有一个客户端应用程序需要“恢复”对这些文件的访问,并使用 HTTP RANGE 标头执行此操作。当它发出这样的请求时,它对从 Azure 返回的结果不满意。

我不确定如何在 Azure 端查看详细信息以查看请求是否失败,或者它是否只是返回了客户端未预料到的内容,并且我对客户端没有调试可见性。

以下是传入范围标头的样子:

RANGE: bytes=4258672-

从我读过的 Azure 文档来看,它似乎支持 RANGE 标头,但是我想知道同时使用 RANGE 和共享访问签名是否存在冲突?

更新: Azure 可能会为 RANGE 请求返回不正确的状态代码,这导致我的客户端应用程序拒绝响应。文档指出,Azure 在响应 RANGE 请求时会以 HTTP 状态代码 206 进行响应,但是当我发出这样的 RANGE 请求时:

curl -I -H "User-Agent: Bonos" -r 500- "https://murfie.blob.core.windows.net/168464/1.mp3?st=2013-07-03T16%3A34%3A32.4832235Z&se=2013-07-03T17%3A34%3A32.4613735Z&sr=b&sp=r&sig=mJgQGW%2Fr3v8HN2%2BVV3Uady7J68nFqeHyzQb37HAhfuE%3D"

Azure 返回以下内容:

HTTP/1.1 200 OK
Content-Length: 19988911
Content-Type: application/octet-stream Charset=UTF-8
Last-Modified: Fri, 07 Jun 2013 16:44:50 GMT
ETag: 0x8D031B57670B986
Server: Blob Service Version 1.0 Microsoft-HTTPAPI/2.0
x-ms-request-id: 77312761-65a9-42ef-90cd-ff718a80b231
Date: Wed, 03 Jul 2013 16:41:01 GMT

【问题讨论】:

    标签: http-headers azure-storage


    【解决方案1】:

    是的,它有效。我使用 SAS 将视频流式传输到使用 Range 标头的手机。

    用一点代码也很容易验证。

    【讨论】:

      【解决方案2】:

      我联系了产品团队的一些成员,得到了以下信息...

      200 vs 206 是由于 curl 命令中存在“-I”标志。这会导致 HEAD 请求而不是 GET,它本质上是作为“获取 blob 属性”调用而不是“获取 blob”,这将导致范围标头被忽略。还要确保将版本标头指定为“x-ms-version:2011-08-18”或更高版本,因为“startByte-”范围格式仅在该版本更高版本上受支持。

      有关范围标头的更多信息,请参阅:http://msdn.microsoft.com/en-us/library/windowsazure/ee691967.aspx

      【讨论】:

      • 嗨布伦特,我今晚做了一些测试并修改了我的 curl 命令以获取文件并将响应的标题写入单独的文件。这样做我能够确认当指定范围的开始和结束字节时,返回 206 响应,但是当未指定结束字节时(IE,“-r 500-”),返回 200 状态.根据此页面:msdn.microsoft.com/en-us/library/windowsazure/ee691967.aspx 范围请求支持开放式格式,因此这些请求应返回 206,对吗?
      • 您是否删除了“-I”标志?
      • 是的,这是一个例子: curl -i -o 1.mp3 "murfie.blob.core.windows.net/168464/…" -D 1mp3head.txt -r 500-
      • 嗯,它还在,第一个参数
      • 小写的“i”,(“在输出中包含协议头(H/F)”)不是大写的“I”(“仅显示文档信息”)
      【解决方案3】:

      我们解决了这个问题。

      正如@BrentDaCodeMonkey 提到的,如果您使用 API 版本 2011-01-18 或更高版本,Azure 会返回预期的 206 响应,但在我们的例子中,我们不是发起请求,因此我们无法使用请求指定此响应标题。

      然而,一些微软朋友告诉我们,您可以为存储帐户全局设置 API 版本,但您需要使用 REST API 来执行此操作(这不是您可以在管理 UI 中执行的操作) .这篇文章解释了如何:

      http://msdn.microsoft.com/en-us/library/windowsazure/hh452235.aspx

      将 DefaultServiceVersion 设置为 2011-01-18 后,我们现在恢复了 RANGE 请求的预期 206 状态。

      【讨论】:

      • 一位沮丧的编码员花了将近两天的时间来解决同样的问题——它应该是 2011-08-18 或更高版本。使用 2011-01-18 会导致 Invalid XML Document 错误。
      • 因为这里没有提到它,所以我只想补充一点,如果你正在使用这个修复程序,它会流向 Azure CDN。
      • 我可以通过邮递员向 Rest API 发出请求吗?我收到此错误:>在 HTTP 请求中找到的 MAC 签名与任何计算的签名不同。
      【解决方案4】:

      对于那些在 Azure 服务 API 和棘手的授权方面苦苦挣扎的人,我推荐这个非常简单的 C# sn-p,它以一种非常简单的方式(至少对我而言)完全一样。

              var credentials = new Microsoft.WindowsAzure.Storage.Auth.StorageCredentials("storagename", "storagekey");
              var account = new Microsoft.WindowsAzure.Storage.CloudStorageAccount(credentials, true);
              var client = account.CreateCloudBlobClient();
              var properties = client.GetServiceProperties();
              properties.DefaultServiceVersion = "2013-08-15";
              client.SetServiceProperties(properties);
      

      您需要添加一个 nuget 包 WindowsAzure.Storage v9.3.3(已过时,但仍然有效)

      【讨论】:

      • 有什么方法可以在 php/Laravel 中实现这一点?
      猜你喜欢
      • 1970-01-01
      • 2022-10-21
      • 2017-08-24
      • 2014-02-08
      • 1970-01-01
      • 1970-01-01
      • 2021-04-17
      • 2021-08-13
      • 2018-09-02
      相关资源
      最近更新 更多