web-dev-qa-db-fra.com

CORS POST Les requêtes ne fonctionnent pas - OPTIONS (Requête incorrecte) - L'origine n'est pas autorisée

Je ne parviens pas à obtenir une demande POST entre domaines de frapper un contrôleur Api dans la dernière version bêta 2.

Chrome (et autres navigateurs) crache:

OPTIONS http://api.hybridwebapp.com/api/values 400 (Bad Request)
POST http://api.hybridwebapp.com/api/values 404 (Not Found) 

Cela peut être lié à à ce problème mais j’ai appliqué cette solution de contournement et plusieurs autres solutions, telles que web.config additions here

Je me suis cogné la tête avec cela pendant un certain temps alors j'ai créé une solution pour reproduire le problème exactement.

Chargez l'application Web, il y aura 2 boutons, l'un pour GET, l'autre pour POST et la réponse apparaîtra à côté du bouton. GET fonctionne. Impossible d'obtenir POST de revenir avec succès.

enter image description here

Je peux obtenir un indice sur la cause de Fiddler, mais cela n'a aucun sens, car si vous examinez la réponse, le domaine est inclus dans l'en-tête Access-Controll-Allow-Origin:

enter image description here

Il existe un dossier dans la solution appelé "ConfigurationScreenshots" avec quelques captures d'écran de la configuration IIS (liaisons de sites Web) et des propriétés du projet afin de pouvoir m'aider aussi facilement que possible :)

EDIT: n'oubliez pas d'ajouter cette entrée dans le fichier hôte (% SystemRoot%\system32\drivers\etc):

 127.0.0.1     hybridwebapp.com  api.hybridwebapp.com

** STATUS: ** Il semble que certains navigateurs tels que Chrome me permettent de continuer avec le POST quel que soit le message d'erreur indiqué dans la réponse à OPTIONS (contrairement à d'autres comme Firefox). Mais je ne considère pas que cela soit résolu.

Regardez les captures d'écran Fidler de la demande OPTIONS qu'il a 

Access-Control-Allow-Origin: http://hybridwebapp.com

Et pourtant l'erreur:

The Origin http://hybridwebapp.com n'est pas autorisé

C'est complètement contradictoire, c'est comme si on ignorait l'en-tête.

24
parliament

Ok j'ai passé ça. Ce doit être le problème le plus étrange que j'ai jamais rencontré. Voici comment le "résoudre":

  1. Continuez comme d'habitude jusqu'à ce que soudainement sorti de nulle part les demandes OPTIONS à ce domaine commencent à retourner 200 OK (au lieu de 400 demandes incorrectes) et POST ne se produit jamais (ou du moins, semble-t-il pas parce que le navigateur l’avale) 
  2. Sachez que la réponse de Fiddler dans OPTIONS contient des doublons mystérieux pour "Access-Control-Allow-XXX". 
  3. Essayez de supprimer la déclaration suivante de votre fichier web.config, même si vous vous en souvenez bien.

Enlève ça:

    <httpProtocol>
       <customHeaders>
         <remove name="X-Powered-By" />
         <add name="Access-Control-Allow-Origin" value="http://mydomain.com" />
         <add name="Access-Control-Allow-Headers" value="Accept, Content-Type, Origin" />
         <add name="Access-Control-Allow-Methods" value="GET, PUT, POST, DELETE, OPTIONS" />
       </customHeaders>
    </httpProtocol>

Parce que vous avez déjà ceci:

 var enableCorsAttribute = new EnableCorsAttribute("http://mydomain.com",
                                                   "Origin, Content-Type, Accept",
                                                   "GET, PUT, POST, DELETE, OPTIONS");
        config.EnableCors(enableCorsAttribute);

Morale: Vous n'avez besoin que d'un seul.

23
parliament

si vous utilisez l'autorisation OAuth. demande pas aller directement à web api. Vous devez activer la prise en charge de OWIN CORS pour ce noeud final.

Comment je fais sur mon site: Installer owin cors

Install-Package Microsoft.Owin.Cors

Remarque: veuillez ne pas utiliser : Install-Package Microsoft.AspNet.WebApi.Cors

Dans le fichier Startup.Auth.cs

 //add this line
            app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);

            // Enable the application to use bearer tokens to authenticate users
            app.UseOAuthBearerTokens(OAuthOptions);
11
Grey Wolf

J'ai un contrôleur MVC (pas un ApiController), mais la solution que j'ai proposée peut aider les autres. Pour autoriser l'accès entre domaines à une action POST (/data/xlsx) sur le contrôleur, j'ai mis en œuvre 2 actions:

  1. pour la vérification pré-vol
  2. pour le poste

Si vous n'avez pas l'action HttpOptions, vous obtenez 404 lors de la vérification avant vol.

Code:

[HttpOptions]
public ActionResult Xlsx()
{
    // Catches and authorises pre-flight requests for /data/xlsx from remote domains
    Response.AddHeader("Access-Control-Allow-Origin", "*");
    Response.AddHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    Response.AddHeader("Access-Control-Allow-Methods", "GET, PUT, POST, DELETE, OPTIONS");
    return null;
}

[HttpPost]
public ActionResult Xlsx(string data, string name)
{
    Xlsx(); // Add CORS headers

    /* ... implementation here ... */
}

Je l'ai testé dans IE 11, Chrome, FireFox.

1
Ilan

Ajoutez ceci à votre fichier startup.cs dans ConfigureOAuth

app.UseCors (Microsoft.Owin.Cors.CorsOptions.AllowAll);

1
Mohsin Muzawar

Essayez d'ajouter le code ci-dessous dans l'en-tête de votre réponse:

Response.AddHeader("Access-Control-Allow-Origin", "*");
0
Wilson Wu