我正在尝试将图像上传到 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)。