AJAX CORS PUT到Azure Blob存储返回405错误

时间:2013-09-17 14:37:09

标签: javascript ajax azure-storage cors

我有一个MVC应用程序,允许用户使用动态生成的SAS将资源上传到blob存储。用户将选择文件并单击上载。单击上载时,会向控制器操作发送ajax调用,该操作将为容器生成SAS并返回一个字符串,该字符串是将附加签名上载的blob的URI。这非常有效,并使用SAS返回正确的URI。然后我有另一个ajax调用,它将使用返回的URI将文件中的数据输出到Azure Blob Storage。执行此操作时,我在Jquery.min文件中遇到“0x80070005访问被拒绝”的javascript运行时错误。

我想确保我已正确编码并且我的SAS是正确的,所以我通过Runscope运行它(我有MVC控制器操作修改URI以通过我的Runscope帐户)。如果我复制了URI并手动设置了我在ajax调用中设置的标头,那就可以了。权限设置有效。使用我生成的SAS,我可以访问该文件,没有它我不能。如果我让它通过我的javascript文件运行ajax调用失败并返回405错误。这是我的ajax调用,然后是我用Runscope发送的两个不同的请求。

我用过这篇文章 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

3 个答案:

答案 0 :(得分:2)

正如BUILD所宣布的那样,Windows Azure存储将在2013年底之前获得CORS支持。

答案 1 :(得分:2)

答案 2 :(得分:0)

其中一个有用的MSDN Blog可能对您有所帮助。

我遗失的代码是

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。