web-dev-qa-db-fra.com

L'en-tête Access-Control-Allow-Origin a plusieurs valeurs OR Contrôle en amont jquery ajax to Web Api 2

J'ai un asp.net formulaires Web application fonctionnant sur localhost: 6414 Alors le jquery ajax appelle un service Web Api sur localhost: 11974  

Je reçois l'erreur  

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

Donc, je passe en revue google et stackoverflow et trouve des tonnes de conflictuelles informations .

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

J'ai essayé le Cors activé et web.config et toutes sortes de techniques .

Actuellement, je me demande si le problème est en réalité le code jQuery des formulaires Web en tant qu’expéditeur, mais en réalité les en-têtes de réponse signifieraient qu’il provient du service api Web ...

Je regarde mes en-têtes de réponse et j'en vois 2

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

J'essaie de commenter cette ligne dans web.config dans Web Api Project

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

ALORS j'obtiens cette erreur 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.

J'ai ce code dans web.config

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

Maintenant, si je décommenter le contrôle d'accès. ... dans web.config et THEN commentaire dans leCORScode dans WebApiConfig . cs 

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

Si ce code est mis en commentaire, j'obtiens une erreur de contrôle en amont.

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

Cela semble complètement fou.

Jquery code

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

            //});
        }

Méthode api Web

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

Si j'appelle cette méthode depuis le même domaine (pour le même port local pour le moment), cela fonctionne bien 

http://localhost:11974/checkbox.html

Ce qui donne...

7
Brian Thornton

Vous vous battez pour votre web.config

Commentez toute la merde que vous avez ajoutée à web.config! 

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

Je ne l'utilise pas et je suis SÛR que c'est un problème Un autre problème est que vous devez commenter  

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

et ensuite DO USE USE ces lignes 

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

Vous pouvez toujours ajouter des fonctions de sécurité, d’authentification et d’autorisation et demander à Cors de ne pas demander globalement, mais par classe ou par méthode, mais si vous rencontrez des difficultés pour faire fonctionner ce dernier, cela devrait fonctionner.

12
Tom Stickel

Activer cors dans startup.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);
    }
0
dichen