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

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

Есть ли способ установить заголовок Access-Control-Allow-Origin капли, возвращаемой лазурью?

Ответы

Ответ 1

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

Параметры CORS можно установить в учетной записи хранилища, используя клиентскую библиотеку Windows.Azure.Storage версии 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);

Ответ 3

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

Ответ 4

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

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

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

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

становится

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

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

Ответ 5

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

Ответ 6

Один из полезных Блог 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
     });
}

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