以任何方式为windows azure blob设置access-control-allow-origin

时间:2011-07-29 18:22:37

标签: azure-storage

我正在通过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标题?

6 个答案:

答案 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