2012-11-28 28 views
2

我正在使用ajax調用基於WCF REST的服務。Jquery Ajax請求調用兩次,並且第一個請求不會在標頭中發送令牌

在頁面加載之前調用ajax方法。 我希望在ajax請求的頭部發送一個「令牌」。在提琴手這是我看到:

1)一個請求的服務沒有在標題中的令牌。(AJAX呼叫失敗) 2)一個請求對同一個服務與標記中的令牌。 AJAX呼叫通過)

之後,一切工作正常鉻和Safari瀏覽器。但IE 10和Mozilla只有一個服務電話。因爲服務調用在IE 10和Mozilla中失敗,因爲請求標頭中沒有標記。

這就是我所說的方法:

function callservice (method, serviceUrl, params, successHandler, errorHandler) { 
    $.ajax({ 
     crossDomain: true, 
     type: method, 
     url: serviceUrl, 
     beforeSend: function (XMLHttpRequest) { XMLHttpRequest.setRequestHeader("Authorization", Token); }, 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: successHandler, 
     error: errorHandler 
    }); 
    function photos(data) { 
     alert(data); 
     console.log(data); 
    }; 
} 

我同時控制Web服務和應用程序(調用該Web服務)。當應用程序和Web服務都駐留在本地主機上時,不會出現此問題。在這種情況下,只有一個成功的服務調用。但有一個跨域調用時有兩個AJAX調用。

我的問題是爲什麼AJAX請求沒有在第一次嘗試中發送令牌? 爲什麼令牌只在第二次AJAX調用中發送?

任何形式的幫助將不勝感激。

+1

你從哪裏調用該函數? – Xymostech

+1

IE 10中的服務調用失敗,Safari瀏覽器應該讀取「IE 10和Mozilla」的權利? –

+0

我在文檔加載之前調用函數:$(document).ready(function(){ }); –

回答

7

問題出在CORS上。早期的瀏覽器不允許對不同於客戶端的域進行ajax請求,因爲它被認爲是安全威脅。現代瀏覽器可以使跨域ajax請求成爲只要服務器與客戶端協同工作。所以這是當瀏覽器發出跨域請求時實際發生的情況:

1.)首先,瀏覽器向服務器發送「預檢」請求以收集授權信息(在我的情況下,這是一個請求頭部方法爲'OPTIONS')來自WCF服務。作爲回報,Web Service將訪問控制允許Origin作爲其響應頭的一部分發送。並且由於此請求而在fiddler上顯示的錯誤是HTTP 500錯誤。此AJAX請求在數據字段中沒有任何內容,因爲它只是一種查找WCF服務的授權細節的方法。

2.)Chrome和Safari現在向Web服務發出了第二個請求,他們已經獲得了該服務的授權詳細信息.Firefox和IE不想向該服務發出第二個Ajax請求,因爲有一個預先請求的HTTP 500錯誤。因此,Chrome和Safari都能夠與該服務進行通信。

因此,解決方案是修改WCF服務的響應,以防發生'Preflight請求'。我修改了服務發送的響應,以防發生'預檢請求'發送HTTP 200 OK響應。這允許瀏覽器如IE和Mozilla在預檢請求之後發送實際的請求。

這裏是我提到的來源之一: http://www.bennadel.com/blog/2327-Cross-Origin-Resource-Sharing-CORS-AJAX-Requests-Between-jQuery-And-Node-js.htm

希望這有助於人們面臨同樣的問題。

-1

XMLHttpRequest:除非他們改變它,否則使用MS Explorer時需要使用ActiveXObject(「Microsoft.XMLHTTP」)。對於我的Ajax調用純JS做,我用這條線,根據TYO瀏覽器中創建對象:

if (window.XMLHttpRequest){ 
    //for most BRowsers 
    r = new XMLHttpRequest(); 
} else{ 
    //for Explorer 
    r = new ActiveXObject("Microsoft.XMLHTTP"); 
} 

應用您beforesend在我這裏的情況下(R)創建的對象。我真的相信這是你與EI的問題。但沒有測試。

+0

首先,海報使用jQuery進行Ajax調用。第二。 IE8 +具有原生XMLHttpRequest支持。這個答案與問題無關。 – epascarello

0

跨域呼叫在同一來源策略下。您無法默認撥打電話。您需要使用CORS或JSONP或代理。

+0

但是Web服務調用在Chrome和Safari中是成功的。那麼我需要做些什麼來解決IE 10和Mozilla中的這個問題? –

+0

錯誤控制檯在這些瀏覽器中說了什麼? – epascarello

+0

加載資源失敗:服務器的響應狀態爲500(內部服務器錯誤) –