4

我正在尝试将图像上传到 azure blob 存储,2 天前代码运行良好,但最近我收到了缺少强制请求标头的错误。以下是返回的错误:

"<?xml version=\"1.0\" encoding=\"utf-8\"?><Error><Code>MissingRequiredHeader</Code><Message>An HTTP header that's mandatory for this request is not specified.\nRequestId:93cefc02-45af-41b0-9cb5-649d485faa49\nTime:2012-10-03T09:05:58.1982699Z</Message><HeaderName>x-ms-blob-type</HeaderName></Error>"

让我解释一下程序流程。我正在使用 nodejs 服务器从 azure 创建 SAS。然后,Windows 8 客户端使用该 sas 将特定文件放入 blob 存储中。

 function uploadFileAsync(uploadURL, file) {
        return new WinJS.Promise(function (complete, error, progress) {
            file.openAsync(Windows.Storage.FileAccessMode.read).then(function (stream) {

                makeBlob(file.contentType, stream).then(function (blob) {
                    WinJS.xhr({ url: uploadURL, type: "PUT", data: blob, headers: { "Content-type":
             file.contentType} }).then(function (res) {
                        complete(res);
                    }, function (err) {
                        error(err);
                    });
                });
            });
        });

    }

 function makeBlob(contentType, stream) {
        return new WinJS.Promise(function (c, e) {
            var blob = window.MSApp.createBlobFromRandomAccessStream(contentType, stream);
                c(blob);
        });
    }

uploadURL 是来自节点服务器的 SAS。

我尝试"x-ms-blob-type": "BlockBlob"在 PUT 请求中添加另一个标头,但是没有用!

WinJS.xhr({ url: uploadURL, type: "PUT", data: blob, headers: { "Content-type":
file.contentType,  "x-ms-blob-type": "BlockBlob" } }).then(function (res) {

我和我的团队尝试使用之前运行良好的我们应用程序的最基本(最旧)版本从多个安装中上传它。由此我们得出结论,在天蓝色的层面上肯定有一些变化。请指教!

更新:终于让它再次工作,这次添加标题 x-ms-blob-type 做到了。Fiddler 确实是一个很大的帮助,感谢 Gaurav ......

然而,使用 Fiddler 向我揭示了一些仍不清楚的事情。

1)以下是提琴手捕获的请求和响应

Request:
PUT /dummy/Content/dummy.bmp?st=2012-10-06T06%3A53%3A49Z&se=2012-10-06T07%3A53%3A49Z&sr=dummy&sig=dummydummyNQ4%3D HTTP/1.1
Accept: */*
Filename: dummy.bmp
Content-Type: image/bmp
x-ms-blob-type: BlockBlob
Method: PUT
UA-CPU: AMD64
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)
Host: dummy.blob.core.windows.net
Content-Length: 85414
Connection: Keep-Alive
Pragma: no-cache

Response:
HTTP/1.1 201 Created
Transfer-Encoding: chunked
Content-MD5: MdRpPr+eOePkjry2+6myQg==
Last-Modified: Sat, 06 Oct 2012 06:57:45 GMT
ETag: "dummyTag"
Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
x-ms-request-id: dummyide-f2defa18c095
x-ms-version: 2011-08-18

serviceVersion 不应该是 2012-02-12,因为我没有在任何地方指定它。所以它不应该默认为最新的。

2)根据这个页面http://msdn.microsoft.com/en-us/library/windowsazure/dd179451.aspx x-ms-blob-type 是一个可选的标题那么为什么它说它是强制性的?

PS:添加所有必需的标题没有帮助。它仍然说 Mandatory Header Missing (x-ms-blob-type)。

4

2 回答 2

0

即使它在 2 天前为您工作,您是否可以尝试从此页面添加所需的标题(例如x-ms-date示例)。

于 2012-10-03T15:14:03.730 回答
0

我在这里寻找从 StorageFile 对象中获取 blob 或 File 的方法。你的makeblob函数给了我一个线索。谢谢。

我建议使用 makeblob 函数的替代方法。

function makeblob(storageFile)
{
    return MSApp.createFileFromStorageFile(storageFile);
}

调用站点也需要稍作更改并调用 file.OpenAsync 可以删除。

关于 PUT blob api 调用 -

  1. 建议显式放置 x-ms-version 标头
  2. 您的 sas 客户端是在做其他事情,比如放置 sharedkey 授权标头等,还是公共 blob?
  3. 我也在解决类似的问题 - win8 客户端、nodejs 服务器、将图像上传到 azure 存储。目前,我可以直接上传到 azure blob 工作。我正在探索使用共享访问签名来查看 win8 客户端是否可以直接与放置 blob api 对话,而不是通过 nodejs 服务器(在 nodejs 服务器上节省一些负载)。尚未通过调查。

HTH。

于 2013-03-22T05:28:16.357 回答