我有一个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
答案 0 :(得分:2)
正如BUILD所宣布的那样,Windows Azure存储将在2013年底之前获得CORS支持。
答案 1 :(得分:2)
Windows Azure存储现在支持CORS预检OPTIONS请求和实际的CORS请求:
答案 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。