CORS habilitado, pero la respuesta para la verificación previa tiene un código de estado HTTP no válido 404 al momento de la inserción de JSON

He buscado a fondo, pero no puedo encontrar una solución a este problema en mi circunstancia particular.

Las llamadas de servicio entre dominios utilizando Fiddler (POST) se ejecutan correctamente y se reciben los datos. Sin embargo, a través del navegador (Chrome) obtengo el mensaje ‘Preflight tiene código de estado HTTP no válido 404’

Tengo una aplicación de API web y he instalado CORS y me aseguro de que esté presente en el archivo web.config:

               

Aquí está la llamada de Ajax:

 var secretKey = 'difusod7899sdfiertwe08wepifdfsodifyosey', url = 'http://api.intrinsic.co.uk/api/v1/PTS/ActiveDrivers?api_key=098werolllfWnCbPGAuIXVOJidDHRfYcgxImMlxTXopuekXrSOqOWzEAIdeNTWGPQPpyHxgVGsFysGFKPzq'; jQuery.ajax ({ url: url, type: "POST", data: JSON.stringify({ secretKey: secretKey}), dataType: "json", contentType: "application/json; charset=utf-8", success: function(data){ var content = ""; $.each(data.ActiveDrivers.DriverLocationStatus, function (index, element) { content += ""; content += ""; content += ""; content += ""; content += ""; content += ""; }); content += "
Driver NumberTimestampVRNLatitudeLongitudeTrack Link
" + element.DriverNumber + "" + dateFormat(element.Timestamp, "d/m/yy") + " " + dateFormat(element.Timestamp, "h:MM TT") + "" + element.VRN + "" + element.CurrentLatitude + "" + element.CurrentLongitude + "Track »
"; $( "#result" ).html( content ); } });

Obviamente, funciona perfectamente en el mismo dominio y, como se mencionó, funciona con Fiddler.

Estoy seguro de que es la comprobación de OPCIONES previas al navegador que falla para el tipo de contenido de ‘application / json’, pero no estoy seguro de cómo solucionarlo.

¿Falta algo en el archivo web.config que debo agregar?

He intentado eliminar ‘content-type’ sin efecto.

Esperaba que este artículo resolviera el problema (parecía prometedor) pero se encontró el mismo error:

 XMLHttpRequest cannot load [URL]. Response for preflight has invalid HTTP status code 404 

Gracias pero obteniendo el error 405, después de que la configuración anterior cambie.

Finalmente funciona después de agregar el código siguiente en el archivo web api Global.asax

 protected void Application_BeginRequest(Object sender, EventArgs e) { //HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*"); if (HttpContext.Current.Request.HttpMethod == "OPTIONS") { HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache"); HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST"); HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept"); HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000"); HttpContext.Current.Response.End(); } } 

Finalmente conseguí que esto funcionara.

Este artículo ‘ WebAPI con CORS – IIS intercepta el verbo OPTIONS ‘ informó mi pensamiento. Una imagen mostraba dónde, en IIS, aparecía el mapeo del controlador OPTIONS y por qué, dentro de web.config, teníamos que eliminarlo para garantizar que IIS no interceptara.

Cuando eché un vistazo a IIS, ese controlador NO ESTABA. Luego eché un vistazo al artículo vinculado ‘ No se puede establecer el orden HttpHandler usando Web.Config a menos que exista una etiqueta ‘ clear ‘y vi que, en este artículo, después de eliminar el controlador OPTION, se agregaba explícitamente dentro de la web .config.

Como no pude ver el controlador OPTION en IIS, también lo agregué al archivo web.config y de repente funcionó. Parecía que esta adición es lo que se necesitaba.

La sección final de controladores web.config se ve de la siguiente manera (aviso que decidí mantener la ‘eliminación’ inicial solo en caso de que esto causara problemas si migraba a un servidor web diferente en el futuro).

                     

Esto funcionó para mí.

En Global.asax

 protected void Application_BeginRequest(Object sender, EventArgs e) { //HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*"); if (HttpContext.Current.Request.HttpMethod == "OPTIONS") { HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache"); HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST"); HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept"); HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000"); HttpContext.Current.Response.End(); } } 

En Web.config

         

reconstruir y listo.

Tengo una configuración similar que mostraba errores 404 y 500 errores mientras intentaba ejecutar CORS en mi servicio web. Mi solución básicamente usó la solución de Hussain, pero mientras limpiaba mi solución, noté que solo se necesitaba una línea de respuesta, y pude mantener los manejadores web originales en el web.config, y NO tuve que mover todo el manejadores de respuesta en el código.

Básicamente, mi solución incluye este UN MAYOR ARREGLO en mi controlador ApplicationOnBeginRequest:

  private void ApplicationOnBeginRequest( object sender, EventArgs eventArgs ) { ... if ( context.Request.HttpMethod == "OPTIONS" ) response.End(); } 

y estos manejadores en mi web.config:

             

Lo siento, no pude enviar esta nota como un comentario a la respuesta de Hussain.

Para asp core, use este código en Startup.cs en el procedimiento Configure. Utilicé para la versión 2.0, pero creo que debería funcionar también con versiones anteriores

 app.UseCors(builder => { builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader(); }); 

Esto también me ayudó, tenía CORS configurado en web.config ya

 protected void Application_BeginRequest(Object sender, EventArgs e) { //HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*"); if (HttpContext.Current.Request.HttpMethod == "OPTIONS") { HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache"); HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST"); HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept"); HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000"); HttpContext.Current.Response.End(); } }