跨域JSON调用

Jac*_*ack 1 asp.net jquery json jsonp asp.net-mvc-3

可能重复:
Ajax跨域调用

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

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

Dar*_*rov 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后让控制器操作返回此自定义操作结果:

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);
}
Run Code Online (Sandbox Code Playgroud)

现在您可以跨域使用此操作:

var url = "http://example.com/SomeController/SomeAction/";
$.getJSON(url + '?callback=?', function (data) {
    alert(data);
});
Run Code Online (Sandbox Code Playgroud)