使用jquery jsonp返回错误回调函数没有被调用

Posted

技术标签:

【中文标题】使用jquery jsonp返回错误回调函数没有被调用【英文标题】:Using jquery jsonp returns error callback function was not called 【发布时间】:2013-10-21 12:41:11 【问题描述】:

我有以下working example,我正在尝试通过 jquery 请求获取http://detectlanguage.com。由于这将是一个跨域请求,我使用的是 jsonp。

这里是 a link in MSDN,有一个类似的请求,据推测 jsonp 是要走的路。

一切都很好,除了页面抛出错误Error: myCallback was not called,我从服务器得到的响应如下:

"data":
  "detections":[
    "language":"ca",
     "isReliable":false,
     "confidence":0.14992503748125938
    ,
    "language":"en",
     "isReliable":false,
     "confidence":0.00 8103727714748784
    ]
   

我整天在 *** 中搜索有关 jsonp 的答案,但还没有得到它的工作。

非常感谢任何帮助

更新

包括AJAX调用

$.ajax(
    url: 'http://ws.detectlanguage.com/0.2/detect',
    data: 
        q: $('#hi').val(),
        key:'demo'
    ,
    jsonpCallback: 'myCallback',
    dataType: "jsonp",
    success: myCallback,
    error: function(e,i,j)
         $('#results').html(j)
    
);

我还有一个叫做myCallbackjavascript函数:

function myCallback(response)
    alert(response.data)

【问题讨论】:

看起来不像是从您调用的服务返回的 jsonp。 显示 ajax 请求,该响应也不是 JSONP 你好,早上好。谢谢你的回复。我已经更新了问题以包括小提琴中的 ajax。此外,我在网络中包含一个链接,其中暗示 jsonp 是要走的路。请看一下问题中包含的小提琴。 【参考方案1】:

响应好像不是jsonp,jsonp响应应该是javascript。下面是适合我的代码。

ajax 请求:

 $.ajax(
            crossDomain: true,
            type:"GET",
            contentType: "application/json; charset=utf-8",
            async:false,
            url: "http://<your service url here>/HelloWorld?callback=?",
            data: projectID:1,
            dataType: "jsonp",                
            jsonpCallback: 'fnsuccesscallback'
        );

服务器端代码返回 jsonp (c#):

 public void HelloWorld(int projectID,string callback)
    

        String s = "Hello World !!";
        StringBuilder sb = new StringBuilder();
        JavaScriptSerializer js = new JavaScriptSerializer();
        sb.Append(callback + "(");
        sb.Append(js.Serialize(s));
        sb.Append(");");
        Context.Response.Clear();
        Context.Response.ContentType = "application/json";
        Context.Response.Write(sb.ToString());
        Context.Response.End();
    

【讨论】:

这么多搜索。这么多天把我的头撞在墙上。出于某种原因,它做到了。谢谢!【参考方案2】:

我还花了很长时间四处寻找答案。我的解决方案与服务有关,而不是 ajax 调用或 jQuery。具体来说,需要在 web.config 中使用此设置将服务设置为允许跨域访问:

<system.serviceModel>
<bindings>
  <webHttpBinding>
    <binding name="webHttpBindingWithJsonP" crossDomainScriptAccessEnabled="true" />
  </webHttpBinding>
</bindings>  

...

  <endpoint address="../YourService.svc"
  binding="webHttpBinding"
  bindingConfiguration="webHttpBindingWithJsonP"
  contract="YourServices.IYourService"
  behaviorConfiguration="webBehavior" />

【讨论】:

以上是关于使用jquery jsonp返回错误回调函数没有被调用的主要内容,如果未能解决你的问题,请参考以下文章

使用 jQuery 中止 JSONP ajax 请求

jsonp回调函数没有被调用

在 AngularJS 中设置 JSONP 回调函数

使用 jQuery 请求 JSONP 时,我可以使用静态(即预先确定的)回调函数名称吗?

jquery jsonp请求错误处理

JSONP 的 getJSON 回调有啥意义?