1

可能重复:
Ajax 跨域调用

我有返回 JSON 响应的 Asp.Net 控制器方法。但是我无法使用 Jquery 从不同的域调用它$.getJSON(...){}

快速谷歌搜索建议必须使用 JSONP。问题是 JSON 和 JSONP 有什么区别?这只是另一个新名词吗?如果 JSONP 工作正常,为什么我不能让 JSON 工作?有什么办法不使用这些花哨的 JSONP 并使用普通的旧 JSON,因为我害怕对我的服务器端代码进行任何更改。

4

3 回答 3

5

You cannot make cross domain AJAX calls using JSON. You need to use JSONP. So instead of returning a regular JsonResult from your controller action write a custom action result that will wrap the JSON in a callback that is passed as parameter:

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);
    }
}

and then have your controller action return this custom action result:

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);
}

Now you could consume this action cross domain:

var url = "http://example.com/SomeController/SomeAction/";
$.getJSON(url + '?callback=?', function (data) {
    alert(data);
});
于 2012-09-25T06:10:36.210 回答
0
JSONP = JSON + PADDING 
      = additional JavaScript callback function wrapping the JSON content.

在 JavaScript 中,所有 ajax 请求都遵循这个跨域策略标准。这可以防止 XMLHttpRequest 对象请求不同域上的资源。

由于 JSON 是有效的 JavaScript,我们不能使用它。JSONP 是作为一种通过编写回调函数并动态添加脚本标签到 DOM 来从某个远程域检索数据的方法创建的,脚本标签将在加载时调用回调,然后数据可供应用程序使用。

要向启用 JSONP 的服务器发出请求,我们需要发送一些关于我们站点的信息,以便服务器可以创建我们可以使用的响应。

于 2012-09-25T04:41:18.703 回答
0

您不能使 jsonp 在所有跨域站点上工作,除了允许您通过使用额外回调(值或名称)告诉您提供有关您的服务器的一些信息的站点。

如果其他站点不允许您提供的回拨,您将一无所获。

于 2012-09-25T06:06:28.313 回答