2017-05-10 32 views
0

我有一個ASP.NET MVC 5項目,其中一個頁面有一些JavaScript調用運行ASP.NET WebApi項目的服務器上的API。這兩個項目通常在不同的域上運行,但在本地它們只在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,所以這就是爲什麼我得到了405。但是,the preflight check is supposed to be skipped when certain conditions are met,這些條件已經在這裏得到滿足。你自己看;下面是JS代碼爲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(); 

爲什麼這個簡單的請求觸發預檢檢查?

回答

0

該問題是由MVC項目中Application Insights加載的一些額外的JavaScript引起的。

我發現這一點,通過調試器進入xmlhttp.send()調用,最終我注意到我在ai.0.js。來自AppInsights的該文件將覆蓋XMLHttpRequestadds a couple custom headers to the request的定義,這會導致需要執行預檢檢查。

因此,有兩種可能的解決方案:

  1. 禁用應用程序洞察並刪除其自定義JavaScript。
  2. 執行OPTIONS在API項目中處理。

Supporting OPTIONS is likely the better solution,所以我最終可能會這樣做,但刪除AppInsights會更快,所以我現在就這樣做。我刪除了在我的_Layout.cshtml視圖中以var appInsights = window.appInsights...開頭的<script>標記,並解決了該問題。

+0

你也應該將此作爲一個問題發佈在AI javascript sdk https://github.com/Microsoft/ApplicationInsights-JS/issues上。我不知道爲什麼AI的存在會迫使瀏覽器進行CORS檢查。 –

+0

@JohnGardner:我沒有在那裏發佈一個問題,因爲我不認爲它是一個錯誤,只是一個不幸的副作用。我相信這是AI添加的自定義標題,強制執行預檢檢查(請參閱我在答案中鏈接到的GitHub上的文件)。如果你認爲它實際上是一個錯誤,請告訴我,我可以開一個問題。 –

相關問題