我正在通过XHR访问的azure上存储json blob。在尝试加载这些blob时,我收到了这个错误:
XMLHttpRequest无法加载http://myazureaccount.blob.core.windows.net/myjsoncontainer/myblob.json?json。 Access-Control-Allow-Origin不允许原点http://localhost。
有没有办法设置azure返回的blob的Access-Control-Allow-Origin标题?
答案 0 :(得分:14)
Windows Azure Storage于2013年11月26日添加了CORS支持:Cross-Origin Resource Sharing (CORS) Support for the Windows Azure Storage Services。更多详细信息和C#/ JavaScript示例 - Windows Azure Storage: Introducing CORS。
可以使用Windows中的.Azure.Storage客户端库版本3.0.1.0或更高版本(可从NuGet获得)使用类似于以下伪代码的内容在存储帐户上设置CORS选项:
var storageAccount = CloudStorageAccount.Parse(
"DefaultEndpointsProtocol=https;AccountName=ABC;AccountKey=XYZ");
var blobClient = storageAccount.CreateCloudBlobClient();
var serviceProperties = blobClient.GetServiceProperties();
serviceProperties.Cors.CorsRules.Clear();
serviceProperties.Cors.CorsRules.Add(new CorsRule() {
AllowedHeaders = { "..." },
AllowedMethods = CorsHttpMethods.Get | CorsHttpMethods.Head,
AllowedOrigins = { "..." },
ExposedHeaders = { "..." },
MaxAgeInSeconds = 600
});
blobClient.SetServiceProperties(serviceProperties);
答案 1 :(得分:3)
目前不是,但Azure的项目经理Scott Hanselman已于2013年2月4日confirmed support for this is coming soon。
答案 2 :(得分:2)
不,他们仍尚未添加此内容。您可以在获取Azure CDN上的对象的Amazon EC2实例上设置代理,然后使用Access-Control-Allow-Origin标头返回数据,该标头允许您通过我们的代理发出请求。你也可以暂时在代理上缓存一些内容以帮助提高速度/性能(这个解决方案显然会受到影响),但它仍然不理想。
答案 3 :(得分:2)
其中一个有用的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。
答案 4 :(得分:1)
您可以尝试使用JSONP。
您的想法是在您的站点上定义一个将接收JSON内容的回调函数,并且您的JSON文档将成为一个JavaScript文件,用所需数据调用您的回调。 [Thomas Conté,2011年8月]
为此,请在JavaScript函数调用中创建一个包装JSON内容的文档:
{ "key": "value", ... }
变为
myFunc({ "key": "value", ... });
现在您没有加载JSON而是JavaScript,script
标签不受单一来源政策的约束。 jQuery提供convenient methods for loading JSONP:
$.ajax({
url: 'http://myazureaccount.blob.core.windows.net/myjsoncontainer/myblob.jsonp?jsonp',
dataType: 'jsonp',
jsonpCallback: 'myFunc',
success: function (data) {
// 'data' now has your JSON object already parsed
// and converted to a JavaScript object.
}
});
答案 5 :(得分:1)
虽然jsonp有效但我不推荐它。请阅读此answer的第一条评论以获取具体信息。我认为解决这个问题的最佳方法是使用CORS。不幸的是,Azure不支持这一点。因此,如果可以,我会将存储提供程序更改为(例如Google Cloud Storage)