我Asp.Net控制器方法,返回JSON響應。然而,我無法使用Jquery的$.getJSON(...){}
從不同的域調用它使用谷歌搜索表示必須使用JSONP。問題是JSON和JSONP有什麼區別?這只是另一個新術語?如果JSONP正在工作,我爲什麼不能讓JSON工作?有沒有辦法不使用這些花哨的JSONP,並使用普通的舊JSON,因爲我擔心我的服務器端代碼的任何更改。
我Asp.Net控制器方法,返回JSON響應。然而,我無法使用Jquery的$.getJSON(...){}
從不同的域調用它使用谷歌搜索表示必須使用JSONP。問題是JSON和JSONP有什麼區別?這只是另一個新術語?如果JSONP正在工作,我爲什麼不能讓JSON工作?有沒有辦法不使用這些花哨的JSONP,並使用普通的舊JSON,因爲我擔心我的服務器端代碼的任何更改。
您無法使用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);
});
JSONP = JSON + PADDING
= additional JavaScript callback function wrapping the JSON content.
在JavaScript中,所有ajax請求都具有此跨域策略標準。 ,它阻止XMLHttpRequest對象請求不同域上的資源。
由於JSON是有效的JavaScript,我們無法使用它。 JSONP被創建爲一種通過編寫回調函數並動態地向DOM添加腳本標記從 檢索數據的方法, 腳本標記將在加載時調用回調,然後數據可供應用程序使用。
要向服務器JSONP啓用請求,我們需要發送一些關於我們網站的信息,以便服務器可以創建我們可以使用的響應。
您不能讓jsonp在所有跨域網站上工作,除了允許您使用額外回撥(值或名稱)提供有關您的服務器的一些信息的域名。
如果其他網站不允許您提供的電話回覆,您從中得不到任何東西。
這是否幫助http://en.wikipedia.org/wiki/JSONP – OJay
一個reg ular JSON ajax將不起作用,因爲它違反了通常在所有現代瀏覽器中都持有的同一起源策略。此政策不允許將JavaScript與其他網域的請求發送到其他網域,因爲存在很多安全問題,特別是瀏覽器存儲的Cookie和會話。如果您有興趣,請閱讀wikipedia。 – Wiz
您可能想查看跨源資源共享(CORS)。 – JayC