0

動的に生成された SAS を使用して、ユーザーがリソースを BLOB ストレージにアップロードできるようにする MVC アプリケーションがあります。ユーザーはファイルを選択し、アップロードをクリックします。アップロードをクリックすると、コントローラー アクションに ajax 呼び出しが送信され、コンテナーの SAS が生成され、署名が追加されてアップロードされる BLOB の URI である文字列が返されます。これは完全に機能し、SAS で正しい URI を返します。次に、返された URI を使用してファイルから Azure Blob Storage にデータを PUT する別の ajax 呼び出しがあります。これを実行すると、Jquery.min ファイルで「0x80070005 アクセスが拒否されました」という JavaScript ランタイム エラーが発生します。

これを正しくコーディングしたことと、SAS が正しいことを確認したかったので、Runscope を介して実行しました (Runscope アカウントを通過するように MVC コントローラー アクションで URI を変更しました)。URI をコピーし、ajax 呼び出しで設定しているヘッダーを手動で設定すると、うまくいきました。そして、許可設定が機能します。生成した SAS を使用するとファイルにアクセスできますが、SAS がないとアクセスできません。ajax 呼び出しを使用して JavaScript ファイルを実行すると、失敗して 405 エラーが返されました。これが私の ajax 呼び出しで、次に Runscope で送信された 2 つの異なる要求です。

この記事を使用しました http://gauravmantri.com/2013/02/16/uploading-large-files-in-windows-azure-blob-storage-using-shared-access-signature-html-and-javascript/#comment ファイルをチャンクでアップロードするためのガイドとして-1700 。次の ajax 呼び出しは、アップロードされたブロックごとに実行されますが、最初の試行で失敗します。

var uri = submitUri + "&comp=block&blockid=" + blockIds[blockIds.length - 1];
var requestData = new Uint8Array(evt.target.result);
$.ajax({
    url: uri,
    type: "PUT",
    data: requestData,
    processData: false,
    beforeSend: function(xhr) {
        xhr.setRequestHeader("x-ms-blob-type", "BlockBlob");
        xhr.setRequestHeader("Content-Length", requestData.length);
    },
    success: function() {
        // successful stuff here
        uploadFileInBlocks();
    }
    error: function (xhr, desc, err) {
        // error stuff here
    }
});

そして、これが私のRunscopeの結果です:

成功した手動リクエスト:

PUT https://<myaccount>.blob.core.windows.net/trainingcourseresources/1002/georgewashington.jpg?sr=c&sp=rw&sig=GI+HN1hTEiyTG9Kz1OIBIcArAEkeZWyxI4v7OmMuEsA=&sv=2012-02-12&se=2013-09-17T13:19:52Z

HEADERS
Accept: */*
Accept-Encoding: gzip, deflate, compress
Connection: close
Host: atlastestblob.blob.core.windows.net
User-Agent: runscope/0.1
X-Ms-Blob-Type: BlockBlob

QUERYSTRING
se: 2013-09-17T13:19:52Z
sig: GI+HN1hTEiyTG9Kz1OIBIcArAEkeZWyxI4v7OmMuEsA=
sp: rw
sr: c
sv: 2012-02-12

Response: 201 Created

失敗した ajax リクエスト:

OPTIONS https://<myaccount>.blob.core.windows.net/trainingcourseresources/1002/cslewis.jpg?sp=rw&sr=c&blockid=YmxvY2stMDAwMDAw&sv=2012-02-12&sig=iIn/AL3eBBFlZdYoT717SMS9iDOY5PEKIdIufOle7NA=&comp=block&se=2013-09-17T13:40:00Z

HEADERS
Accept: */*
Accept-Encoding: gzip, deflate
Access-Control-Request-Headers: content-type, accept, x-ms-blob-type
Access-Control-Request-Method: PUT
Cache-Control: no-cache
Connection: close
Dnt: 1
Host: atlastestblob.blob.core.windows.net
Origin: https://localhost:44308
User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)

QUERYSTRING
blockid: YmxvY2stMDAwMDAw
comp: block
se: 2013-09-17T13:40:00Z
sig: iIn/AL3eBBFlZdYoT717SMS9iDOY5PEKIdIufOle7NA=
sp: rw
sr: c
sv: 2012-02-12

Response: 405 The resource doesn't support specified Http Verb
4

3 に答える 3

2

Windows Azure ストレージは、CORS プリフライト OPTIONS 要求と実際の CORS 要求の両方をサポートするようになりました。

http://blogs.msdn.com/b/windowsazurestorage/archive/2013/11/27/windows-azure-storage-release-introducing-cors-json-minute-metrics-and-more.aspx

于 2013-11-28T01:01:07.967 に答える
0

役に立つMSDN ブログの 1 つです。

私が行方不明だったコードは

private static void ConfigureCors(ServiceProperties serviceProperties)
{
    serviceProperties.Cors = new CorsProperties();
    serviceProperties.Cors.CorsRules.Add(new CorsRule()
    {
        AllowedHeaders = new List<string>() { "*" },
        AllowedMethods = CorsHttpMethods.Put | CorsHttpMethods.Get | CorsHttpMethods.Head | CorsHttpMethods.Post,
        AllowedOrigins = new List<string>() { "*" },
        ExposedHeaders = new List<string>() { "*" },
        MaxAgeInSeconds = 1800 // 30 minutes
     });
}

基本的に、SAS Url にいくつかのルールを追加し、ファイルを BLOB にアップロードできます。

于 2014-04-21T06:52:48.637 に答える