【发布时间】:2016-08-24 09:44:45
【问题描述】:
我正在尝试使用以下 jquery 代码从我正在开发的 Chrome 应用程序向我的 Azure 存储上的 blob 执行一个简单的 GET 请求:
$.ajax({
headers: {
'x-ms-range': 'bytes=' + from + '-' + to,
'x-ms-version': version,
'x-ms-client-request-id': guid()
},
url: 'https://storage-name.blob.core.windows.net/container-id/blob-id?sv=2015-07-08&sr=b&sig=signature&st=2016-08-24T08%3A58%3A30Z&se=2016-08-24T09%3A28%3A30Z&sp=rl&api-version=2015-07-08&',
type: "GET",
}).done(function (data) {
}).fail(function (error) {
});
当我尝试时,我收到以下错误:
XMLHttpRequest 无法加载 https://storage-name.blob.core.windows.net/container-id/blob-id?sv=2015-07-08&sr=b&sig=signature&st=2016-08-24T08%3A58%3A30Z&se=2016-08-24T09%3A28%3A30Z&sp=rl。对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问 Origin 'chrome-extension://blablabla'。响应的 HTTP 状态代码为 403。
请帮忙!我尝试了很多 CORS 选项,但没有一个对我有用。 我真的想保留一个简单的 ajax 请求,并避免为该请求使用自定义库。
谢谢!
更新
我通过以下代码尝试了enabling CORS:
$.ajax({
url: 'https://docbetaeustorage.blob.core.windows.net/?restype=service&comp=properties',
headers: {
'Content-Type': 'application/xml',
'x-ms-date': new Date(),
'x-ms-version': '2013-08-15',
'Authorization': 'SharedKey'
},
type: "PUT",
data: '<?xml version="1.0" encoding="utf-8"?><StorageServiceProperties><Cors><CorsRule><AllowedOrigins>' + THIS_URL + '</AllowedOrigins><AllowedMethods>GET,PUT</AllowedMethods><MaxAgeInSeconds>500</MaxAgeInSeconds><ExposedHeaders>x-ms-*</ExposedHeaders><AllowedHeaders>x-ms-*</AllowedHeaders></CorsRule></Cors></StorageServiceProperties>'
}).done(function (data) {
}).fail(function (error) {
});
现在我收到此请求的预检错误...
【问题讨论】:
-
只是为了测试目的,您可以尝试将 AllowedOrigins 、 ExposedHeaders 和 AllowedHeaders 设置为 * 吗?
-
没关系......它仍然落在预检中。
-
几个愚蠢的疑问 - 根据文档,'x-ms-date' 应该是 UTC - 这会是个问题吗?你确定x-ms-version吗? Azure 存储服务的当前版本是 2015-12-11
-
也不适用于 UTC,这是根据 msdn.microsoft.com/en-us/library/azure/hh452235.aspx 的版本。我认为 put 请求甚至没有被处理...它卡在自动生成的 OPTIONS 请求上...
-
OPTIONS 飞行前请求将为 PUT 和 DELETE 跨域请求以及其他动词生成,以防有自定义标头并且内容类型不在允许的类型范围内。因此,如果您在该请求中通过了良好的身份验证,则预检应该不是问题
标签: jquery cors google-chrome-app azure-blob-storage