HTTP RANGE标头是否与Azure Blob存储共享访问签名一起使用?

时间:2013-07-01 16:06:26

标签: http-headers azure-storage

我正在使用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

4 个答案:

答案 0 :(得分:7)

我们理顺了这一点。

正如@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状态。

答案 1 :(得分:2)

我联系了产品团队的一些成员并获得了以下内容......

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

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

答案 2 :(得分:2)

对于那些正在努力使用Azure Service API和棘手的授权的人,我建议使用这个非常简单的C#片段,以非常简单的方式完成相同的操作(至少对我而言)。

        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 = await client.GetServicePropertiesAsync();
        properties.DefaultServiceVersion = "2013-08-15";
        await client.SetServicePropertiesAsync(properties);

答案 3 :(得分:1)

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

使用一些代码也很容易验证。