Tengo un método de acción simple, que devuelve algo de json. Se ejecuta en ajax.example.com. Necesito acceder a esto desde otro sitio someothersite.com.
Si trato de llamarlo, obtengo el esperado ...:
Origin http://someothersite.com is not allowed by Access-Control-Allow-Origin.
Sé de dos maneras de evitar esto: JSONP y crear un HttpHandler personalizado para establecer el encabezado.
¿No hay una manera más simple?
¿No es posible para una acción simple definir una lista de orígenes permitidos o simplemente permitir a todos? Tal vez un filtro de acción?
Lo óptimo sería ...:
return json(mydata, JsonBehaviour.IDontCareWhoAccessesMe);
json
asp.net-mvc-3
cors
asp.net-ajax
Kjensen
fuente
fuente
Respuestas:
Para controladores simples ASP.NET MVC
Crea un nuevo atributo
Etiqueta tu acción:
Para la API web ASP.NET
Etiquetar un controlador API completo:
O llamadas API individuales:
Para Internet Explorer <= v9
IE <= 9 no es compatible con CORS. He escrito un javascript que enrutará automáticamente esas solicitudes a través de un proxy. Todo es 100% transparente (solo tiene que incluir mi proxy y el script).
Descárguelo usando nuget
corsproxy
y siga las instrucciones incluidas.Publicación de blog | Código fuente
fuente
Si está utilizando IIS 7+, puede colocar un archivo web.config en la raíz de la carpeta con esto en la sección system.webServer:
Ver: http://msdn.microsoft.com/en-us/library/ms178685.aspx y: http://enable-cors.org/#how-iis7
fuente
Me encontré con un problema en el que el navegador se negaba a entregar contenido que había recuperado cuando la solicitud pasó en cookies (por ejemplo, el xhr tenía su
withCredentials=true
), y el sitio se habíaAccess-Control-Allow-Origin
configurado*
. (El error en Chrome fue: "No se puede usar comodín en Access-Control-Allow-Origin cuando el indicador de credenciales es verdadero").Sobre la base de la respuesta de @jgauffin, creé esto, que es básicamente una forma de evitar esa verificación de seguridad del navegador en particular, por lo que se debe advertir.
fuente
Esto es realmente simple, solo agregue esto en web.config
En Origin, coloque todos los dominios que tienen acceso a su servidor web, en los encabezados coloque todos los encabezados posibles que cualquier solicitud ajax http puede usar, en los métodos coloque todos los métodos que permita en su servidor
Saludos :)
fuente
A veces, el verbo OPTIONS también causa problemas
Simplemente: actualice su web.config con lo siguiente
Y actualice los encabezados del servicio web / controlador con httpGet y httpOptions
fuente
WebAPI 2 ahora tiene un paquete para CORS que se puede instalar usando: Install-Package Microsoft.AspNet.WebApi.Cors -pre -project WebServic
Una vez que esté instalado, siga esto para el código: http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api
fuente
Agregue esta línea a su método, si está utilizando una API.
fuente
Este tutorial es muy útil. Para dar un resumen rápido:
Use el paquete CORS disponible en Nuget:
Install-Package Microsoft.AspNet.WebApi.Cors
En su
WebApiConfig.cs
archivo, agregueconfig.EnableCors()
alRegister()
método.Agregue un atributo a los controladores que necesita para manejar cors:
[EnableCors(origins: "<origin address in here>", headers: "*", methods: "*")]
fuente
fuente
Otra forma es agregar código como se muestra a continuación en el archivo webApiconfig.cs.
config.EnableCors (nuevo EnableCorsAttribute (" ", encabezados: " ", métodos: "*", expuestosHeaders: "TestHeaderToExpose") {SupportsCredentials = true});
O podemos agregar el siguiente código en el archivo Global.Asax.
Lo he escrito para las opciones. Modifique lo mismo según su necesidad.
Feliz codificación !!
fuente
Después de luchar durante toda una noche, finalmente conseguí que esto funcionara. Después de algunas depuraciones, encontré que el problema con el que me encontraba era que mi cliente estaba enviando una llamada solicitud de Opciones de verificación previa para verificar si la aplicación podía enviar una solicitud de publicación con el origen, los métodos y los encabezados provistos. No quería usar Owin o un APIController, así que comencé a cavar y se me ocurrió la siguiente solución con solo un ActionFilterAttribute. Especialmente la parte "Acceso-Control-Permitir-Encabezados" es muy importante, ya que los encabezados mencionados allí tienen que coincidir con los encabezados que enviará su solicitud.
Finalmente, mi método de acción MVC se ve así. Importante aquí es mencionar también las Opciones HttpVerbs, porque de lo contrario la solicitud de verificación previa fallará.
fuente
En Web.config ingrese lo siguiente
fuente
Si usa IIS, le sugiero que pruebe el módulo IIS CORS .
Es fácil de configurar y funciona para todo tipo de controladores.
Aquí hay un ejemplo de configuración:
fuente
Estoy usando DotNet Core MVC y después de luchar durante unas horas con paquetes nuget, Startup.cs, atributos y este lugar, simplemente agregué esto a la acción MVC:
Me doy cuenta de que esto es bastante torpe, pero es todo lo que necesitaba, y nada más quería agregar esos encabezados. ¡Espero que esto ayude a alguien más!
fuente