working not net mvc issue enable asp c# asp.net-mvc angularjs asp.net-web-api cors

c# - not - enable cors web api mvc



MVC web api: No hay encabezado ''Access-Control-Allow-Origin'' presente en el recurso solicitado (11)

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


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:

  • "En la configuración de los módulos IIS, conecte el WebDAVModule, si su servidor web lo tiene, luego quítelo".

O agregue a su configuración:

<system.webServer> <modules> <remove name="WebDAVModule"/> </modules> <handlers> <remove name="WebDAV" /> ... </handlers>


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:

`public static void Register(HttpConfiguration config) { // Web API configuration and services config.EnableCors(); var enableCorsAttribute = new EnableCorsAttribute("*", "Origin, Content-Type, Accept", "GET, PUT, POST, DELETE, OPTIONS"); config.EnableCors(enableCorsAttribute); // Web API routes config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", //routeTemplate: "api/{controller}/{id}", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } ); config.Formatters.Add(new BrowserJsonFormatter()); } public class BrowserJsonFormatter : JsonMediaTypeFormatter { public BrowserJsonFormatter() { this.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html")); this.SerializerSettings.Formatting = Formatting.Indented; } public override void SetDefaultContentHeaders(Type type, HttpContentHeaders headers, MediaTypeHeaderValue mediaType) { base.SetDefaultContentHeaders(type, headers, mediaType); headers.ContentType = new MediaTypeHeaderValue("application/json"); } }`


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á

var cors = new EnableCorsAttribute("http://testing.azurewebsites.net/", "*", "*"); config.EnableCors(cors);

pero esto funcionará:

var cors = new EnableCorsAttribute("http://testing.azurewebsites.net", "*", "*"); config.EnableCors(cors);

El efecto es el mismo si se usa el atributo EnableCors.


La respuesta de @ Mihai-Andrei Dinculescu funcionó para mí, por ejemplo:

  • Agregar un <httpProtocol> en la sección <system.webServer> web.config
  • Devolución de respuesta vacía para solicitudes OPTIONS a través de la mencionada Application_BeginRequest() en global.asax

Excepto que su cheque para Request.Headers.AllKeys.Contains("Origin") NO funcionó para mí, porque la solicitud contenía un origing , 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 insensible a mayúsculas y minúsculas de su verificación Contains su lugar: if (culture.CompareInfo.IndexOf(string.Join(",", Request.Headers.AllKeys), "Origin", CompareOptions.IgnoreCase) >= 0) {


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:

Access-Control-Allow-Origin: * Access-Control-Allow-Methods: GET, POST, PUT, DELETE Access-Control-Allow-Headers: content-type

La razón es que el navegador enviará primero una solicitud de OPCIONES para ''probar'' su servidor y ver las autorizaciones


Pruebe esto para asegurarse de haber configurado CORS correctamente:

[EnableCors(origins: "*", headers: "*", methods: "*")]

¿Sigue sin funcionar? Verifique la presencia de encabezados HTTP.


Puede ser debido a la instalación de los 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


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:

protected void Application_BeginRequest() { if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS") { Response.Headers.Add("Access-Control-Allow-Origin", "https://localhost:44343"); Response.Headers.Add("Access-Control-Allow-Headers", "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With"); Response.Headers.Add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); Response.Headers.Add("Access-Control-Allow-Credentials", "true"); Response.Flush(); } }

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.


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 en la línea a continuación.

<remove name="OPTIONSVerbHandler" />

Lo acabo de eliminar de Web.Config (solo coméntelo como se muestra a continuación) y Cors funciona de maravilla

<handlers> <!-- remove name="OPTIONSVerbHandler" / --> </handlers>


Si tiene seguridad / requestFiltering nodos en su web.config de la siguiente manera:

<security> <requestFiltering> <verbs allowUnlisted="false"> <add verb="GET" allowed="true" /> <add verb="POST" allowed="true" /> <add verb="PUT" allowed="true" /> <add verb="DELETE" allowed="true" /> <add verb="DEBUG" allowed="true" /> </verbs> </requestFiltering>

asegúrese de agregar esto también

<add verb="OPTIONS" allowed="true" />


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

<system.webServer> <httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="*" /> <add name="Access-Control-Allow-Headers" value="Content-Type" /> <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" /> </customHeaders> </httpProtocol> </system.webServer>

Tenga en cuenta que los métodos se especifican individualmente, en lugar de usar * . Esto se debe a que se produce un error al usar * .

También puede habilitar CORS por código.

Actualizar
Se requiere el siguiente paquete NuGet : Microsoft.AspNet.WebApi.Cors .

public static class WebApiConfig { public static void Register(HttpConfiguration config) { config.EnableCors(); // ... } }

Luego puede usar el atributo [EnableCors] en acciones o controladores como este

[EnableCors(origins: "http://www.example.com", headers: "*", methods: "*")]

O puedes registrarlo globalmente

public static class WebApiConfig { public static void Register(HttpConfiguration config) { var cors = new EnableCorsAttribute("http://www.example.com", "*", "*"); config.EnableCors(cors); // ... } }

También debe manejar las solicitudes de Options verificación previa con HTTP OPTIONS solicitudes de HTTP OPTIONS .

Web API debe responder a la solicitud de Options para confirmar que está configurada para admitir CORS .

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í:

# Global.asax.cs protected void Application_BeginRequest() { if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS") { Response.Flush(); } }

Esta verificación adicional se agregó para garantizar que las APIs antiguas que fueron diseñadas para aceptar solo solicitudes GET y POST no sean explotadas. Imagine enviar una solicitud DELETE a una API diseñada cuando este verbo no existía. El resultado es impredecible y los resultados pueden ser peligrosos .