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.
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:
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.
Ok j'ai passé ça. Ce doit être le problème le plus étrange que j'ai jamais rencontré. Voici comment le "résoudre":
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.
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);
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:
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.
Ajoutez ceci à votre fichier startup.cs dans ConfigureOAuth
app.UseCors (Microsoft.Owin.Cors.CorsOptions.AllowAll);
Essayez d'ajouter le code ci-dessous dans l'en-tête de votre réponse:
Response.AddHeader("Access-Control-Allow-Origin", "*");