画像を 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 を作成しています。この sas は、Windows 8 クライアントによって使用され、特定のファイルが BLOB ストレージに PUT されます。
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: REQUIRED ヘッダーをすべて追加しても役に立ちませんでした。必須のヘッダーがありません (x-ms-blob-type) とまだ表示されています。