跨域JSON调用

时间:2012-09-25 03:56:09

标签: jquery asp.net json asp.net-mvc-3 jsonp

  

可能重复:
  Ajax cross domain call

我有Asp.Net Controller方法返回JSON响应。但是我无法使用Jquery的$.getJSON(...){}

从其他域中调用它

快速谷歌搜索表明必须使用JSONP。问题是JSON和JSONP有什么区别?这只是另一个新名词吗?如果JSONP正在工作,为什么我不能让JSON工作?有没有办法不使用这些花哨的JSONP并使用普通的旧JSON,因为我担心我的服务器端代码有任何变化。

3 个答案:

答案 0 :(得分: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);
});

答案 1 :(得分:0)

JSONP = JSON + PADDING 
      = additional JavaScript callback function wrapping the JSON content.

在JavaScript中,所有ajax请求都要遵循此跨域策略标准。 这会阻止XMLHttpRequest对象请求不同域上的资源。

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

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

答案 2 :(得分:0)

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

如果其他网站不允许您提供的回叫,那么您将无法获得任何回复。