Любой способ установить access-control-allow-origin для blob-объекта Windows azure

Я храню JSON blobs в azure, к которым я обращаюсь через XHR. При попытке загрузить эти капли я получаю эту ошибку:
XMLHttpRequest не может загрузить http://myazureaccount.blob.core.windows.net/myjsoncontainer/myblob.json?json. Происхождение http://localhost не допускается с помощью Access-Control-Allow-Origin.

есть ли способ установить Управление Доступом-Разрешить-Origin заголовок blob-объекта, возвращаемого azure?

6 ответов


Windows Azure Storage добавлена поддержка CORS 26 ноября 2013 года:поддержка совместного использования ресурсов (CORS) для служб хранения Windows Azure. Подробнее и примеры C#/JavaScript -хранилище Windows Azure: представляем CORS.

параметры CORS можно установить в учетной записи хранения с помощью Windows.Лазурный.Клиентская библиотека хранилища версии 3.0.1.0 или более поздней, доступная из NuGet, используя что-то похожее на следующее псевдокод:

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);

в настоящее время нет, но Скотт Хансельман, менеджер программ для Azure, имеет подтвержденная поддержка для этого в ближайшее время 4 февраля 2013 года.


Неа, они еще не добавили это. Вы можете настроить прокси-сервер на экземпляре Amazon EC2, который извлекает объекты из Azure CDN, а затем возвращает данные с заголовком Access-Control-Allow-Origin, который позволяет выполнять запросы через наш прокси-сервер. Вы также можете временно кэшировать материал на прокси-сервере, чтобы помочь со скоростью / производительностью (это решение, очевидно, принимает удар там), но это все еще не идеально.


один из полезных блог MSDN это может помочь вам всем.

код, который я не было

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
     });
}

он в основном добавляет некоторые правила в Url SAS, и я могу загружать свои файлы в blob.


вы можете попробовать использовать JSONP.

идея заключается в том, что вы определяете функцию обратного вызова на своем сайте, которая будет получать содержимое JSON, и ваш документ JSON становится файлом JavaScript, который вызывает ваш обратный вызов с требуемыми данными. [Томас Конте, август 2011 г.]

для этого создайте документ, который обертывает содержимое JSON в вызов функции JavaScript:

{ "key": "value", ... }

становится

myFunc({ "key": "value", ... });

теперь ты не загрузка JSON, но JavaScript и script теги не подлежат единой политике происхождения. библиотека jQuery предоставляет удобные методы загрузки 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.
    }
});

пока JSONP работает, я бы не рекомендовал его. Прочитайте первый комментарий к этому ответ для конкретики. Я думаю, что лучший способ обойти это-использовать CORS. К сожалению, Azure не поддерживает это. Поэтому, если вы можете, я бы изменил поставщиков хранения на тот, который делает (Google Cloud Storage например)