JSONP - 访问控制 - 允许来源和MIME类型错误

问题描述:

我想创建一个jsonp请求的服务器和客户端,我似乎无法使其工作。我浏览过很多指南,博客文章等,但几乎每个人都只显示客户端。JSONP - 访问控制 - 允许来源和MIME类型错误

这里是我的客户端代码

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

我的问题返回一个硬编码值是我不能请求和响应的共同努力。目前,该响应返回应用程序/ JSON,所以如果我改变了我的请求RO期待与

资源解释为脚本,但使用MIME类型application/JSON转移JSONP它的错误。 未捕获的ReferenceError:未定义jsonpCallback

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

现在,如果我改变的数据类型为应用程序/ 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=?到URL。这很令人沮丧。

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

这不工作的原因是因为你的服务器总是返回一个硬编码的方法名称和您的客户端使用匿名success处理程序。这是行不通的。您需要配置服务器以使用作为参数传递的方法名称,否则它将永远不会在客户端调用回调。所以一旦你将服务器配置为顾及jsoncallback查询参数,你可以像这样的测试:

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

现在,服务器将收到可能是这样一个请求:

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

,它适当Content-Type以及明显(application/json

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

:应该是这样回应。

+0

我已经改变了代码来拉入默认的回调名称,但我仍然收到其他错误。资源被解释为脚本,但通过MIME类型application/json传输。 – Josh 2010-11-19 20:44:34

我也想提供这个片段,我用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; 
     } 
    }