2017-05-10 1 views
0

J'ai un projet ASP.NET MVC 5 et l'une des pages contient du JavaScript qui appelle une API sur un serveur qui exécute un projet ASP.NET WebApi. Les deux projets fonctionnent normalement sur des domaines différents, mais localement, ils se trouvent sur des ports différents sur localhost. Ce JavaScript fait une demande GET, mais quand je regarde le journal de réseau une demande OPTIONS est faite à la place, et le WebApi renvoie 405 Method Not Authorized.Pourquoi cette requête AJAX sur mon site ASP.NET MVC déclenche-t-elle un contrôle en amont?

D'après mes recherches, je sais que this is a "preflight" check that is sometimes triggered for AJAX calls, et je sais que ASP.NET WebApi doesn't support OPTIONS by default, c'est pourquoi je reçois la 405. Cependant, the preflight check is supposed to be skipped when certain conditions are met, et ces conditions sont réunies ici. Voir par vous-même; ce qui suit est le (anonymisées) intégralité du code JS pour la requête AJAX:

var xmlhttp = new XMLHttpRequest(); 
var url = "http://localhost:12345/api/SomeAction?someArg=" + someArg; 

xmlhttp.onreadystatechange = function() { 
    if (xmlhttp.readyState === 4 && xmlhttp.status === 200) { 
    // [snip], process the result here 
    } 
}; 

xmlhttp.open("GET", url, true); 
xmlhttp.send(); 

Pourquoi cette simple demande le déclenchement d'une vérification préalable?

Répondre

0

Le problème était dû à l'ajout de JavaScript supplémentaire par Application Insights dans le projet MVC.

J'ai découvert cela en entrant dans l'appel xmlhttp.send() avec le débogueur, où j'ai finalement remarqué que j'étais dans ai.0.js. Ce fichier d'AppInsights remplace la définition de XMLHttpRequest et adds a couple custom headers to the request, ce qui entraîne la vérification du contrôle en amont.

Ainsi, il existe deux solutions possibles:

  1. Désactiver Insights application et supprimer son JavaScript personnalisé.
  2. Mettre en œuvre OPTIONS gérer dans le projet API.

Supporting OPTIONS is likely the better solution, donc je vais probablement le faire éventuellement, mais supprimer AppInsights est plus rapide, donc je le fais pour l'instant. J'ai supprimé la balise <script> qui a commencé avec var appInsights = window.appInsights... dans ma vue _Layout.cshtml et qui a résolu le problème.

+0

vous devriez également signaler cela comme un problème sur l'AI javascript sdk https://github.com/Microsoft/ApplicationInsights-JS/issues. Je ne sais pas pourquoi la présence de l'IA forcerait un contrôle CORS par le navigateur. –

+0

@JohnGardner: Je n'avais pas posté de problème là-bas parce que je ne pensais pas que c'était forcément un bug, juste un effet secondaire regrettable. Je crois que ce sont les en-têtes personnalisés que AI ajoute qui forcent le contrôle en amont (voir le fichier sur GitHub auquel je suis lié dans ma réponse). Faites-moi savoir si vous pensez que c'est un bug, et je peux ouvrir un problème. –