2012-06-21 56 views
2

我試圖製作一個獨立的HTML文件,通過CORS向RESTful JSON服務發出跨域請求。CORS使用Cookie的平面HTML文件發出的Ajax請求

我的jQuery Ajax請求:

var query = $.ajax(
{ 
    type: 'GET', 
    url: 'http://localhost:8626/Home/About', 
    contentType: 'application/json', 
    dataType: 'json', 
    success: function (response) 
    { 
     alert('success'); 
     alert(query.getAllResponseHeaders()); 
     alert($.cookie('SessionID')); 
    }, 
    error: function (x, e) 
    { 
     alert('error ' + e); 
    } 
}); 

我設置了訪問控制,等標題上(ASP MVC3)服務器端:

public ActionResult About() 
{ 
    Response.AddHeader("Access-Control-Allow-Origin", "*"); 

    Response.AddHeader("Access-Control-Allow-Methods", "PUT, GET, POST, DELETE"); 

    Response.AddHeader("Access-Control-Allow-Headers", "Content-Type"); 

    Response.SetCookie(new HttpCookie("SessionID", "1234")); 

    return Json(new { name = "John" }, JsonRequestBehavior.AllowGet); 
} 

除了餅乾,一切正常。我正確地得到了我的響應JSON數據。

但我也從服務器發回一個cookie。它不會在標題中顯示爲Set-Cookie,並且不會顯示在Cookie集合中。我已閱讀here,要得到餅乾在跨域請求,您需要設置在$就調用以下:

xhrFields: 
{ 
    withCredentials: true 
}, 

當我添加此,呼叫不再工作,與JS錯誤:

Cannot use wildcard in Access-Control-Allow-Origin when credentials flag is true. 

很明顯,它是關於我的Access-Control-Allow-Origin標頭是「*」。

由於這是一個扁平的獨立HTML文件(源自磁盤而不是來自HTTP服務器),因此Chrome會傳遞等於「null」的Origin標頭。我似乎無法重寫此值 - 當我添加自定義Origin標頭時,Chrome顯然無視它。

如果我回到訪問控制允許來源=「空」(從請求起源頭值匹配),我得到JS錯誤:

Origin null is not allowed by Access-Control-Allow-Origin. 

所以我不知道該怎麼做。我無法使用通配符獲得我的cookie,並且允許「null」而不起作用。

這不可能嗎?還是我錯過了一個步驟?

回答

0

試着把你的頁面放在網站上並通過網絡訪問它(你可以將它掛載到本地web服務器上)。

如果您只是想在Chrome上進行測試 - Chrome瀏覽器的啓動標誌爲--disable-web-security

此鏈接是關於如何使用參數啓動Chrome: http://www.chromium.org/developers/how-tos/run-chromium-with-flags