8

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

但是,我有一个客户端应用程序需要“恢复”对这些文件的访问,并使用 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

4 回答 4

8

我们解决了这个问题。

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

于 2013-07-18T14:57:16.983 回答
4

对于那些在 Azure 服务 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 = client.GetServiceProperties();
        properties.DefaultServiceVersion = "2013-08-15";
        client.SetServiceProperties(properties);

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

于 2016-12-20T21:59:50.733 回答
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

于 2013-07-10T14:27:47.953 回答
1

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

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

于 2013-07-02T16:44:28.330 回答