4

画像を A​​zure 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) とまだ表示されています。

4

2 に答える 2

0

StorageFileオブジェクトからblobまたはFileを取得する方法を探してここに行きました。あなたのmakeblob関数は私にリードを与えました。ありがとう。

makeblob関数の代替案を提案します。

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

呼び出しサイトも少し変更してファイルを呼び出す必要があります。OpenAsyncは削除できます。

PUTblobapi呼び出しに関して-

  1. x-ms-versionヘッダーを明示的に配置することを提案します
  2. あなたのsasクライアントはsharedkey認証ヘッダーなどを置く他のことをしていますか、それともパブリックblobですか?
  3. 私も同様の問題を解決しています-win8クライアント、nodejsサーバー、紺碧のストレージへの画像のアップロード。現在、紺碧のブロブへの直接アップロードが機能しています。私は共有アクセス署名を使用して、win8クライアントが直接通信してblob apiを配置できるかどうかを調べており、nodejsサーバーを経由しないようにしています(nodejsサーバーの負荷をある程度節約します)。まだ調査を通過していません。

HTH。

于 2013-03-22T05:28:16.357 に答える
0

2 日前はうまくいきましたが、このページから必要なヘッダーを追加してみてください(例の x-ms-dateなど)。

于 2012-10-03T15:14:03.730 に答える