JSONP请求成功,但不返回任何数据
我无法从我的某个网站检索JSONP数据。 现场数据由以下MVC2控制器操作提供:
public JsonResult JsonList(string key) {
var consultants = rep.FindAll().Where(c => c.IsActive).Select(c => new ConsultantJsonItem { Firstname = c.Firstname, Surname = c.Surname });
return Json(consultants, "application/json");
}
在网站B上,我使用jQuery来检索JSON,如下所示:
$.ajax({
url: 'http://www.siteA.com/controller/jsonaction/',
dataType: 'JSONP',
crossDomain: true,
success: function (json) {
alert("success"); // THIS DISPLAYS
alert(json); // THIS IS ALWAYS EMPTY
},
error: function (xhr, status, error) {
alert(status); // NOT CALLED
}
});
我可以在Firebug控制台看到响应以200代码正确完成,并且我可以看到响应的内容长度为11516字节,但响应选项卡完全是空的,jQuery不会提供任何数据来处理。
谁能告诉我为什么这是?
注意:这个网站使用jQuery 1.4.2
您正在返回与JSONP不同的JSON:
return Json(consultants, "application/json");
您在客户端上设置dataType: 'JSONP'
的事实只是您需要完成的工作的一半。 下半部分在服务器上。
检出以下答案,说明如何创建一个自定义JsonpResult
,它将使用回调查询字符串参数将响应封装到JSONP中。
所以:
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 JsonList(string key)
{
var consultants = rep.FindAll().Where(c => c.IsActive).Select(c => new ConsultantJsonItem { Firstname = c.Firstname, Surname = c.Surname });
return new JsonpResult(consultants);
}
并在客户端:
$.ajax({
url: 'http://www.siteA.com/controller/jsonaction/',
jsonp: 'callback',
dataType: 'jsonp',
success: function (json) {
alert(json);
}
});
你给的回应不是JSONP ..它是JSON。 JSONP需要封装在一个函数名中;
foo({ "valid": "json" });
关于为什么JSONP需要被包围在一个函数名称(即填充)中的更多细节,以及它如何绕过SOP限制,可以在这个答案中看到。
要在ASP.NET中返回JSONP,你似乎需要手动完成它,比如在这个问题中; ASP.net MVC返回JSONP
就你而言,你甚至不应该看到“成功”警报; 但这是由于您正在使用的jQuery版本(1.4.2)中的一个错误。 通过jQuery不支持直到1.5的crossDomain
,并且它专门检查jsonp
的dataType
(而不是JSONP
),最终你最终通过XMLHttpRequest
发出了标准的JSON请求,而浏览器正在放弃执行SOP。 但是,jQuery误解了已终止对象的状态。
最终,这导致成功处理程序被调用,而data
未初始化( ""
)。