2011-07-29 13 views
14

Estoy almacenando blobs json en azul a los que estoy accediendo a través de XHR. Al intentar cargar estos blobs obtengo este error:
XMLHttpRequest no puede cargar http://myazureaccount.blob.core.windows.net/myjsoncontainer/myblob.json?json. El origen http://localhost no está permitido por Access-Control-Allow-Origin.Cualquier forma de establecer access-control-allow-origin para un blob azul de Windows

¿Hay alguna manera de establecer el encabezado Access-Control-Allow-Origin de un blob devuelto por azure?

Respuesta

14

almacenamiento de Windows Azure añadió CORS soporte el 26 de noviembre de 2013: Cross-Origin Resource Sharing (CORS) Support for the Windows Azure Storage Services. Más detalles y muestras de C#/JavaScript - Windows Azure Storage: Introducing CORS.

Las opciones CORS se puede establecer en una cuenta de almacenamiento utilizando el cliente de versión de la biblioteca Windows.Azure.Storage 3.0.1.0 o posterior, disponible en NuGet, usando algo similar al siguiente pseudocódigo:

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

No, ellos todavía no han agregado esto. Puede configurar un proxy en una instancia de Amazon EC2 que recupera los objetos en el CDN de Azure y, a continuación, devuelve los datos con el encabezado Access-Control-Allow-Origin, que le permite realizar las solicitudes a través de nuestro proxy. También puede almacenar temporalmente cosas en el proxy para ayudar con la velocidad/el rendimiento (esta solución, obviamente, tiene éxito allí), pero todavía no es ideal.

1

Puede probar con JSONP.

La idea es que defina una función de devolución de llamada en su sitio que recibirá el contenido JSON, y su documento JSON se convertirá en un archivo JavaScript al invocar su devolución de llamada con los datos deseados. [Thomas Conté, agosto de 2011]

Para ello, cree un documento que envuelve su contenido JSON en una llamada a la función JavaScript:

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

convierte

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

Ahora no va a cargar JSON pero las etiquetas JavaScript y script no están sujetas a la Política de origen único. jQuery proporciona 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. 
    } 
}); 
1

Si bien las obras JSONP, yo no lo recomendaría. Lea el primer comentario a este answer para detalles. Creo que la mejor manera de evitar esto es usar CORS. Desafortunadamente, Azure no es compatible con esto. Así que si puedes, lo haría cambiar de proveedor de almacenamiento para uno que lo haga (Google Cloud Storage por ejemplo)

2

Uno de la útil MSDN Blog podría ayudarlos a todos.

El código que me faltaba era

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

Básicamente añadir algunas reglas para SAS Url, y soy capaz de subir mis archivos a blob.

+0

+1. Gracias..... – morpheus

Cuestiones relacionadas