2012-02-28 35 views
5

我正在調查本地(file:// access)html應用程序的.NET WCF域服務的跨域使用情況。該應用程序正在使用jQuery進行AJAX調用。jQuery.Ajax「訪問被限制的URI被拒絕」的解釋?

如果服務器上沒有身份驗證(即使用匿名身份驗證),我已經使用CORS「Access-Control-Allow-Origin:*」頭以JSON格式成功檢索了JSON格式的數據,並且沒有頭。

現在我試圖瞭解身份驗證和CORS頭與JSON(而不是JSONP)格式數據的位置時的行爲。

下面的jQuery代碼會向服務器發送一個請求,服務器又會響應「HTTP/1.1 401 Unauthorized」。

$.ajax({ 
    url: myUrl, 
    dataType: 'json', 
    cache: false, 
    complete: function() { /* do stuff */ }, 
    timeout: 5000, 
    data: myData 
}); 

下面的jQuery代碼不會向服務器發出請求,並立即拋出一個異常「訪問受限制的URI被拒絕」,代碼1012

$.ajax({ 
    url: myUrl, 
    dataType: 'json', 
    cache: false, 
    complete: function() { /* do stuff */ }, 
    timeout: 5000, 
    username: "chris", 
    password: "password", 
    data: myData 
}); 

我的理解,並期望第一種情況。任何人都可以向我解釋第二種情況下的例外情況嗎?我本來希望至少可以提出這個請求。

編輯:Grrr,這是在FF 10.0.2。 Chrome似乎按照我的預期行事,這是FF問題嗎?

回答

0

你可以使用一個回調函數來解決這個問題: http://docs.jquery.com/Ajax/jQuery.ajax#options

+0

我意識到我可以用jQuery.ajax回調函數之一來捕獲錯誤,或者使用帶有JSONP的回調函數 - 那是您的意思嗎?我的問題真的只是爲什麼(也許只是Firefox)沒有提出請求,而是在這種情況下引發錯誤。 – Chris 2012-02-28 11:26:49

5

如果您使用的憑據,如餅乾或HTTP基本身份驗證的用戶名/密碼字段在跨域請求,你還需要設置「withCredentials 「XHR上的標誌爲true。在jQuery中,這是通過$ .ajax調用的xhrFields屬性完成的。更改您的代碼來讀取

$.ajax({ 
    url: myUrl, 
    dataType: 'json', 
    cache: false, 
    complete: function() { /* do stuff */ }, 
    timeout: 5000, 
    username: "chris", 
    password: "password", 
    data: myData, 
    xhrFields: { withCredentials: true } 
}); 

此外,在另一端的服務器無法使用「*」與證書的訪問控制允許來源頭。而是必須提供發送給它的Origin標頭的精確匹配。