Intenté todo lo que está escrito en este artículo: http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api , pero nada funciona. Estoy tratando de obtener datos de webAPI2 (MVC5) para usar en otro dominio usando angularJS.
mi controlador se ve así:
namespace tapuzWebAPI.Controllers
{
[EnableCors(origins: "http://local.tapuz.co.il", headers: "*", methods: "*", SupportsCredentials = true)]
[RoutePrefix("api/homepage")]
public class HomePageController : ApiController
{
[HttpGet]
[Route("GetMainItems")]
//[ResponseType(typeof(Product))]
public List<usp_MobileSelectTopSecondaryItemsByCategoryResult> GetMainItems()
{
HomePageDALcs dal = new HomePageDALcs();
//Three product added to display the data
//HomePagePromotedItems.Value.Add(new HomePagePromotedItem.Value.FirstOrDefault((p) => p.ID == id));
List<usp_MobileSelectTopSecondaryItemsByCategoryResult> items = dal.MobileSelectTopSecondaryItemsByCategory(3, 5);
return items;
}
}
}
c#
asp.net-mvc
angularjs
asp.net-web-api
cors
Noa Gani
fuente
fuente
Respuestas:
Debe habilitar CORS en su API web . La forma más fácil y preferida de habilitar CORS a nivel mundial es agregar lo siguiente en web.config
Tenga en cuenta que los métodos se especifican individualmente, en lugar de usarlos
*
. Esto se debe a que se produce un error al usarlo*
.También puede habilitar CORS por código.
Modificar
la siguiente NuGet se requiere paquete:
Microsoft.AspNet.WebApi.Cors
.Luego puede usar el
[EnableCors]
atributo en acciones o controladores como esteO puedes registrarlo globalmente
También debe manejar las
Options
solicitudes de verificación previa conHTTP OPTIONS
solicitudes.Web API
necesita responder a laOptions
solicitud para confirmar que está configurada para admitirCORS
.Para manejar esto, todo lo que necesita hacer es enviar una respuesta vacía . Puedes hacer esto dentro de tus acciones, o puedes hacerlo globalmente así:
Esta verificación adicional se agregó para garantizar que los antiguos
APIs
que fueron diseñados para aceptar soloGET
y lasPOST
solicitudes no sean explotadas. Imagina enviar unaDELETE
solicitud a unAPI
diseñado cuando este verbo no existe. El resultado es impredecible y los resultados pueden ser peligrosos .fuente
La respuesta de @ Mihai-Andrei Dinculescu es correcta, pero para beneficio de los buscadores, también hay un punto sutil que puede causar este error.
Agregar un '/' al final de su URL evitará que EnableCors funcione en todos los casos (por ejemplo, desde la página de inicio).
Es decir, esto no funcionará
pero esto funcionará:
El efecto es el mismo si se usa el atributo EnableCors.
fuente
Seguí todos los pasos anteriores indicados por Mihai-Andrei Dinculescu .
Pero en mi caso, necesitaba 1 paso más porque las OPCIONES http estaban deshabilitadas en la Web. Configure por la línea de abajo.
<remove name="OPTIONSVerbHandler" />
Lo acabo de eliminar de Web.Config (solo coméntelo como se muestra a continuación) y Cors funciona de maravilla
fuente
Puede ser debido a la instalación de paquetes Nuget de Cors.
Si enfrenta el problema después de instalar y deshabilitar cors de nuget, puede intentar reinstalar la API web.
Desde el administrador de paquetes, ejecute
Update-Package Microsoft.AspNet.WebApi -reinstall
fuente
Pruebe esto para asegurarse de haber configurado CORS correctamente:
¿Sigue sin funcionar? Verifique la presencia de encabezados HTTP.
fuente
config.EnableCors()
es necesario para esto también.Para que cualquier protocolo CORS funcione, debe tener un método OPTIONS en cada punto final (o un filtro global con este método) que devolverá esos encabezados:
La razón es que el navegador enviará primero una solicitud de OPCIONES para 'probar' su servidor y ver las autorizaciones
fuente
Entiendo el siguiente caso sobre cors. Tal vez sea útil para alguien. Si agrega la función 'WebDav Redirector' a su servidor, las solicitudes PUT y DELETE fallarán.
Por lo tanto, deberá eliminar 'WebDAVModule' de su servidor IIS:
O agregue a su configuración:
fuente
Sé que voy a llegar muy tarde. Sin embargo, para cualquiera que esté buscando, pensé en publicar lo que FINALMENTE funcionó para mí. No digo que sea la mejor solución, solo que funcionó.
Nuestro servicio WebApi utiliza el método config.EnableCors (corsAttribute). Sin embargo, incluso con eso, todavía fallaría en las solicitudes previas al vuelo. La respuesta de @ Mihai-Andrei Dinculescu me dio la pista. En primer lugar, agregué su código Application_BeginRequest () para vaciar las solicitudes de opciones. Eso TODAVÍA no funcionó para mí. El problema es que WebAPI todavía no estaba agregando ninguno de los encabezados esperados a la solicitud de OPCIONES. Lavarlo solo no funcionó, pero me dio una idea. Agregué los encabezados personalizados que de otro modo se agregarían a través de web.config a la respuesta a la solicitud de OPCIONES. Aquí está mi código:
Obviamente, esto solo se aplica a las solicitudes de OPCIONES. Todos los demás verbos son manejados por la configuración CORS. Si hay un mejor enfoque para esto, soy todo oídos. Me parece una trampa y preferiría que los encabezados se agregaran automáticamente, pero esto es lo que finalmente funcionó y me permitió seguir adelante.
fuente
La respuesta de @ Mihai-Andrei Dinculescu funcionó para mí, por ejemplo:
<httpProtocol>
en la<system.webServer>
sección web.configOPTIONS
solicitudes a través de lo mencionadoApplication_BeginRequest()
englobal.asax
Excepto que su cheque
Request.Headers.AllKeys.Contains("Origin")
NO funcionó para mí, porque la solicitud contenía unoriging
, así que en minúsculas. Creo que mi navegador (Chrome) lo envía así para solicitudes CORS.Resolví esto un poco más genéricamente usando una variante de su
Contains
cheque que no distingue entre mayúsculas y minúsculas :if (culture.CompareInfo.IndexOf(string.Join(",", Request.Headers.AllKeys), "Origin", CompareOptions.IgnoreCase) >= 0) {
fuente
Si tiene seguridad \ requestFiltering nodos en su web.config de la siguiente manera:
asegúrese de agregar esto también
fuente
Había intentado todo lo que pude encontrar en la red, incluidos los métodos que se dieron en esta respuesta. Después de casi tratar de resolver el problema durante todo el día, he encontrado la solución que me ha funcionado de maravilla.
en el archivo WebApiConfig en la carpeta App_Start , comente todas las líneas de código y agregue el siguiente código:
fuente
Sé que la gente probablemente encontrará esto muy obvio al principio, pero realmente piense en esto. Esto a menudo puede suceder si has hecho algo mal.
Por ejemplo, tuve este problema porque no agregué una entrada de host a mi archivo de hosts. El verdadero problema era la resolución de DNS. O acabo de obtener la URL base incorrecta.
A veces recibo este error si el token de identidad proviene de un servidor, pero estoy tratando de usarlo en otro.
A veces obtendrá este error si tiene el recurso incorrecto.
Puede obtener esto si coloca el middleware CORS demasiado tarde en la cadena.
fuente
Evite la habilitación de múltiples lugares CORS, como WebApiCOnfig.cs, el método GrantResourceOwnerCredentials en el proveedor y el atributo de encabezado del controlador, etc.
El siguiente código es más que suficiente para corregir el origen de permitir el control de acceso. // Asegúrese de que app.UseCors debe estar en la parte superior de la línea de código de configuración.
Esto ralentizó mi problema.
fuente
Ese problema ocurre cuando intenta acceder desde un dominio diferente o un puerto diferente.
Si está utilizando Visual Studio, vaya a Herramientas> Administrador de paquetes NuGet> Consola del Administrador de paquetes. Allí debe instalar el paquete NuGet Microsoft.AspNet.WebApi.Cors
Luego, en PROJECT> App_Start> WebApiConfig, habilite CORS
Una vez instalado con éxito, cree la solución y eso debería ser suficiente
fuente