CORS abilitato ma la risposta per il preflight ha un codice di stato HTTP 404 non valido durante il POSTing JSON

Ho cercato accuratamente ma non riesco a trovare una soluzione a questo problema nella mia circostanza particolare.

Le chiamate di servizio tra domini tramite Fiddler (POST) vengono eseguite correttamente e i dati vengono ricevuti. Tuttavia, tramite il browser (Chrome) viene visualizzato il messaggio ‘preflight ha codice di stato HTTP non valido 404’

Ho un’applicazione Web API e ho installato CORS e ho assicurato che quanto segue sia presente nel file web.config:

               

Ecco la chiamata 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 ); } });

Ovviamente, funziona perfettamente nello stesso dominio e, come detto, funziona usando Fiddler.

Sono certo che è il preflight OPTIONS del browser che verifica un errore per il tipo di contenuto di ‘application / json’, ma non sono sicuro di come risolverlo.

C’è qualcosa che manca nel file web.config che dovrei aggiungere?

Ho provato a rimuovere ‘content-type’ senza alcun effetto.

Speravo che questo articolo risolvesse il problema (sembrava promettente) ma si è verificato lo stesso errore:

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

Grazie ma ricevendo errore 405, dopo che la configurazione di cui sopra cambia.

Finalmente funziona dopo aver aggiunto il codice sottostante nel file 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 l’ho fatto funzionare.

Questo articolo ” WebAPI con CORS – IIS intercetta il verbo OPTIONS ” ha informato il mio pensiero. Un’immagine mostrava dove, in IIS, appariva la mapping del gestore OPTIONS e perché, all’interno di web.config, era necessario rimuoverlo per assicurarsi che IIS non lo intercettasse.

Quando ho dato un’occhiata a IIS, il gestore non era lì. Ho quindi dato un’occhiata all’articolo collegato ‘ Imansible impostare l’ordine HttpHandler usando Web.Config a meno che esista un tag “clear ” e visto che, in questo articolo, dopo aver rimosso il gestore OPTION, è stato quindi aggiunto esplicitamente all’interno del web .config.

Siccome non ho potuto vedere il gestore OPTION in IIS, anch’io l’ho aggiunto al file web.config e tutto ha funzionato all’improvviso. Sembrava che questa aggiunta fosse ciò che era necessario.

La sezione finale dei gestori di web.config si presenta come segue (nota che ho deciso di mantenere la “rimozione” iniziale nel caso in cui ciò abbia causato problemi se avessi effettuato la migrazione su un server web diverso in futuro).

                     

Questo ha funzionato per me.

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

In Web.config

         

ribuild e hey presto.

Ho una configurazione simile che mostrava 404 errori e 500 errori mentre stavo cercando di far girare CORS sul mio servizio web. Fondamentalmente la mia soluzione utilizzava la soluzione di Hussain, ma mentre ripulivo la mia correzione, notai che era necessaria solo una linea di risposta, e che ero in grado di mantenere i gestori web originali nel web.config, e NON dovevo spostare tutto il gestori di risposta nel codice.

Fondamentalmente, la mia correzione include questo ONE MAJOR FIX nel mio gestore ApplicationOnBeginRequest:

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

e questi gestori nel mio web.config:

             

Scusa se non ho potuto inviare questa nota come commento alla risposta di Hussain.

Per asp core utilizzare questo codice in Startup.cs nella procedura Configure. Ho usato per la versione 2.0 ma penso che dovrebbe funzionare anche con i vecchi

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

Questo mi ha aiutato anche io, avevo già configurato CORS in web.config

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