2017-05-10 2 views
0

私はASP.NET MVC 5プロジェクトを持っていて、ページの1つにASP.NET WebApiプロジェクトを実行しているサーバー上でAPIを呼び出すJavaScriptがあります。 2つのプロジェクトは通常異なるドメインで動作しますが、ローカルではlocalhostの異なるポートにあるだけです。このJavaScriptはGETリクエストを作成していますが、ネットワークログを見ると代わりにOPTIONSリクエストが行われており、WebApiは405 Method Not Authorizedを返します。ASP.NET MVCサイトのこのAJAXリクエストがプリフライトチェックをトリガーしているのはなぜですか?

私の研究から、私はそのthis is a "preflight" check that is sometimes triggered for AJAX callsを知っている、と私はそのASP.NET WebApi doesn't support OPTIONS by defaultを知って、私はthe preflight check is supposed to be skipped when certain conditions are met、しかし、405を取得していて、これらの条件は、ここで満たされている理由ですので。自分で見て;以下は、AJAX要求のJSコードの(匿名)全体である:

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

なぜプリフライトチェックをトリガーこの単純な要求がありますか?

答えて

0

この問題は、MVCプロジェクトのApplication Insightsによって読み込まれたJavaScriptが追加されたためです。

デバッガを使ってxmlhttp.send()コールに入ると、これは私が最終的に私がai.0.jsにあったことに気づいたのを発見しました。 AppInsightsのファイルは、XMLHttpRequestadds a couple custom headers to the requestの定義よりも優先され、プリフライトチェックが必要になります。

は、このようにそこに2つの解決策です:

  1. 無効にしたアプリケーションの洞察とそのカスタムJavaScriptを取り除きます。
  2. APIプロジェクトでの処理OPTIONSの実装。

Supporting OPTIONS is likely the better solutionだから、最終的にはそうするだろうが、AppInsightsを削除する方が速いので、今のところそれをやっている。 var appInsights = window.appInsights...で始まって_Layout.cshtmlビューにある<script>タグを削除し、問題を修正しました。

+0

また、これをAI javascript sdk https://github.com/Microsoft/ApplicationInsights-JS/issuesに掲載してください。 AIの存在がブラウザによってCORSチェックを強制する理由はわかりません。 –

+0

@JohnGardner:必ずしもバグではないと思ったので、私はそこに問題を投稿していませんでした。ただ残念な副作用です。 AIが追加したカスタムヘッダーは、プリフライトチェックを強制するものだと私は信じています(GitHubのファイルを参照してください)。あなたが実際にバグだと思ったら教えてください。私は問題を開くことができます。 –

関連する問題