JSONP - Access-Control-Allow-Origin和MIME类型错误

时间:2010-11-19 20:09:43

标签: jquery ajax cross-domain jsonp

我正在尝试创建jsonp请求的服务器端和客户端,我似乎无法使其工作。我看了很多指南,博客文章等,但几乎每个人都只展示了客户端。

这是我的客户代码

$.ajax({
    dataType: 'application/json',
    data: params,
    jsonp: 'jsonpCallback',
    url: settings.domain + '/httpext.dll?json_cc',
    success: function (data) {
        //determine the return status
    },
    error: function (response, status, error) {
        //error handling
    }
}); //end ajax

现在,服务器正在返回一个像这样的

的硬编码值
jsonpCallback({"username":"meltingice","posts"1234});

我的问题是我无法得到请求和响应一起工作。目前,响应正在返回application / json,所以如果我改变了我的请求,那么期望jsonp错误

资源解释为脚本,但使用MIME类型application / json进行传输。 未捕获的ReferenceError:未定义jsonpCallback

首先,如您所见,我已经定义了jsonpCallback。

现在,如果我将dataType更改为application / json,那么我会收到此错误

XMLHttpRequest cannot load http://myserver/httpext.dll?json_cc&sid=adsfhasjdkfhajksdghjk%3Basdhg&action=SALE&ccCard=&ccNum=&ccExMM=0&ccExYYYY=0&ccCVV2=&holdersName=&totalDue=0&dueDate=11%2F19%2F2010. Origin http://localhost:59905 is not allowed by Access-Control-Allow-Origin.

正如您所看到的,它没有将callback=?放入网址。这令人沮丧。

如何设置服务器端以便我可以使用jsonp调用它?响应类型需要什么?如何格式化返回的数据,以便我的客户端代码可以撤回数据?

2 个答案:

答案 0 :(得分:5)

这不起作用的原因是因为您的服务器始终返回硬编码的方法名称,而您的客户端使用的是匿名success处理程序。这不行。您需要将服务器配置为使用作为参数传递的方法名称,否则它将永远不会在客户端调用success回调。因此,一旦您将服务器配置为考虑jsoncallback查询参数,就可以像这样测试它:

$.getJSON(settings.domain + '/httpext.dll?json_cc&jsoncallback=?', params, function(result) {
    alert('success');
});

现在服务器将收到一个如下所示的请求:

http://foo.com/httpext.dll?json_cc&jsoncallback=jsonp1290183992345

它应该像这样回应:

jsonp1290183992345({"username":"meltingice","posts"1234});

显然也是Content-Type application/json

答案 1 :(得分:1)

我还想提供我在ASP.NET MVC中使用的代码片段来处理jsoncallback。

    private static ActionResult GetContent(object data, string callback)
    {
        if (!string.IsNullOrEmpty(callback))
        {
            ContentResult result = new ContentResult();
            result.ContentType = "application/json";

            JavaScriptSerializer serializer = new JavaScriptSerializer();
            string json = serializer.Serialize(data);
            result.Content = string.Format("{0}({1})", callback, json);
            return result;
        }
        else
        {
            JsonResult result = new JsonResult();
            result.Data = data;
            result.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
            return result;
        }
    }