2012-09-25 82 views
1

可能重複:
Ajax cross domain call跨域調用JSON

我Asp.Net控制器方法,返回JSON響應。然而,我無法使用Jquery的$.getJSON(...){}

從不同的域調用它使用谷歌搜索表示必須使用JSONP。問題是JSON和JSONP有什麼區別?這只是另一個新術語?如果JSONP正在工作,我爲什麼不能讓JSON工作?有沒有辦法不使用這些花哨的JSONP,並使用普通的舊JSON,因爲我擔心我的服務器端代碼的任何更改。

+0

這是否幫助http://en.wikipedia.org/wiki/JSONP – OJay

+0

一個reg ular JSON ajax將不起作用,因爲它違反了通常在所有現代瀏覽器中都持有的同一起源策略。此政策不允許將JavaScript與其他網域的請求發送到其他網域,因爲存在很多安全問題,特別是瀏覽器存儲的Cookie和會話。如果您有興趣,請閱讀wikipedia。 – Wiz

+0

您可能想查看跨源資源共享(CORS)。 – JayC

回答

5

您無法使用JSON進行跨域AJAX調用。您需要使用JSONP。因此,而不是從你的控制器動作返回一個普通JsonResult編寫自定義操作結果將包裝JSON在作爲參數傳遞迴調:

public class JsonpResult : ActionResult 
{ 
    private readonly object _obj; 

    public JsonpResult(object obj) 
    { 
     _obj = obj; 
    } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     var serializer = new JavaScriptSerializer(); 
     var callbackname = context.HttpContext.Request["callback"]; 
     var jsonp = string.Format("{0}({1})", callbackname, serializer.Serialize(_obj)); 
     var response = context.HttpContext.Response; 
     response.ContentType = "application/json"; 
     response.Write(jsonp); 
    } 
} 

,然後讓你的控制器動作返回這個自定義操作結果:

public ActionResult SomeAction() 
{ 
    var result = new[] 
    { 
     new { Id = 1, Name = "item 1" }, 
     new { Id = 2, Name = "item 2" }, 
     new { Id = 3, Name = "item 3" }, 
    }; 
    return new JsonpResult(balances); 
} 

現在你可以消耗這個動作跨域:

var url = "http://example.com/SomeController/SomeAction/"; 
$.getJSON(url + '?callback=?', function (data) { 
    alert(data); 
}); 
0
JSONP = JSON + PADDING 
     = additional JavaScript callback function wrapping the JSON content. 

在JavaScript中,所有ajax請求都具有此跨域策略標準。 ,它阻止XMLHttpRequest對象請求不同域上的資源。

由於JSON是有效的JavaScript,我們無法使用它。 JSONP被創建爲一種通過編寫回調函數並動態地向DOM添加腳本標記從 檢索數據的方法, 腳本標記將在加載時調用回調,然後數據可供應用程序使用。

要向服務器JSONP啓用請求,我們需要發送一些關於我們網站的信息,以便服務器可以創建我們可以使用的響應。

0

您不能讓jsonp在所有跨域網站上工作,除了允許您使用額外回撥(值或名稱)提供有關您的服務器的一些信息的域名。

如果其他網站不允許您提供的電話回覆,您從中得不到任何東西。