Access-Control-Allow-Origin intestazione ha più valori O di verifica preliminare di jquery, ajax, Web Api 2

Ho un asp.net web form applicazione in esecuzione su localhost:6414 Poi jquery ajax chiama un servizio di Web Api su localhost:11974

Ricevo l’errore

The 'Access-Control-Allow-Origin' header contains multiple values '*, *', but only one is allowed. Origin 'http://localhost:6414' is therefore not allowed access. 

Così ho pettinare google e stackoverflow e trovare tonnellate di in conflitto informazioni.

1. Fix with web.config   
2. Fix with jquery ajax call
3. Fix with CORS in web.api 

Ho provato il Cors abilitato e web.config e tutti i tipi di tecniche.

Attualmente mi chiedo se il problema è effettivamente il web form di codice jquery come mittente, ma in realtà le intestazioni di risposta significherebbe che non è il servizio di web api…

Guardo il mio Header di Risposta e vedo 2 di questi

Access-Control-Allow-Origin:*  ( repeated TWICE)

Cerco di commentare questa riga nel web.config nel Web Api Progetto

<add name="Access-Control-Allow-Origin" value="*" />

QUINDI ottengo questo errore 401:

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:6414' is therefore not allowed access. The response had HTTP status code 401.

Ho questo codice nel web.config

<authentication mode="Windows" />
<authorization>
  <allow verbs="OPTIONS" users="*" />
  <deny users="?" />
</authorization>

Ora, se ho commento il di Controllo di Accesso.… in web.config e POI commento il CORS codice in WebApiConfig.cs

var cors = new EnableCorsAttribute("*", "*", "*");
config.EnableCors(cors);

Se il codice è commentato POI ho preflight errore

 XMLHttpRequest cannot load http://localhost:11974/PostCheckBox. Response for preflight has invalid HTTP status code 405

Questo sembra completamente folle.

Codice Jquery

function sendCheckboxes(id, out, yes, no) {
            //$(function () {
            //var storm = { id: 1902, StormOut: 1, StormYes: 1, StormNo: 1 };
            var storm = { id: id, StormOut: out, StormYes: yes, StormNo: no };
            //jQuery.support.cors = true;
            $.ajax({
                type: "POST",
                data: JSON.stringify(storm),
                url: "http://localhost:11974/PostCheckBox",
                contentType: "application/json",
                //crossDomain: true,
                success: function (data) {
                    console.log(data)
                },
                error: function (x, y, z) {
                    console.log(x + '\n' + y + '\n' + z);
                }
            });

            //});
        }

Web api metodo

[Route("PostCheckBox")]
public HttpResponseMessage PostCheckBox([FromBody] StormData storm) 
    {.... }

Se io chiamo questo metodo dal dominio stesso (per ora stessa porta su localhost) funziona benissimo

http://localhost:11974/checkbox.html

Quello che dà…



2 Replies
  1. 12

    Si stanno combattendo il web.config

    Commento di tutte le stronzate che hai aggiunto al web.config!

     <authentication mode="Windows" />
        <authorization>
          <allow verbs="OPTIONS" users="*" />
          <deny users="?" />
     </authorization>

    Io non uso e che sono SICURO che è 1 problema
    Inoltre, un altro è che è necessario per commento

    <add name="Access-Control-Allow-Origin" value="*" />

    e poi FARE USO queste linee

    var cors = new EnableCorsAttribute("*", "*", "*");
    config.EnableCors(cors);

    Si può sempre aggiungere in sicurezza , autenticazione e di autorizzazione, e sono Cors specifiche richiesta non globale, ma in Classe o un Metodo, ma se si stanno avendo un momento difficile con solo ottenere la cosa per lavoro quindi questo è, infatti, il lavoro.

    • Ok, porca vacca, che, come per magia, chiamando il servizio
    • Questo funziona in .net 4.6 vs 2015, avevo appoggiato giù per 4.5.2 e aveva “problemi” e sono andato .net 4.5 e funziona bene
    • Ho avuto lo stesso problema , ho provato con WebAPI CORS pacchetto. Ha funzionato perfettamente bene. Ma mi chiedo perché l’aggiunta di cose nel web.config non era funzionante. Dà Risposta per la verifica preliminare è non valido il codice di stato HTTP 405″ ho semplicemente utilizzare il seguente righe nel mio web.config <add name="Access-Control-Allow-Origin" value="*" /> <add name="Access-Control-Allow-Headers" value="*" /> <add name="Access-Control-Allow-Methods" value="*" />
    • Così nel web.config che funziona ok? Avrei potuto avere ereditato una gonfio web.config che mi ha causato un tale dolore che commentando e l’eliminazione di 2 a 3 sezioni risolvere il problema per me così io tendo a stare lontano dal web.config per QUESTO caso specifico.
    • IIS pagine di errore sono ancora serviti senza CORS intestazioni con questa soluzione :(.
    • Non è sicuro, si potrebbe postare una domanda COSÌ
    • Grande funzionato come un fascino

  2. 0

    Attivare cors in avvio.cs

        public void Configuration(IAppBuilder app)
        {
            HttpConfiguration config = new HttpConfiguration();
    
            app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
            ConfigureOAuth(app);
    
            WebApiConfig.Register(config);
    
            //Make sure this line is called before ConfigureAuth(app), 
            //app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
    
            app.UseWebApi(config);
        }

Lascia un commento