1

哎哟!

我正在使用 WCF 服务来处理来自单独域上的 Web 服务器的 ajax 调用(因此使用 JSONP)。我的电话看起来像这样:

$.ajax({
    dataType: 'jsonp',
    type: 'GET',
    url: 'http://localhost/s.svc/login?callback=?&l=en&e=foo&p=bar',
    success: function (serverData) {
        // [...]
    },
    error: function (jqXHR, textStatus, errorThrown) {
        // [...]
    }
});

我从服务器得到的响应如下所示:

?({"DataIsValid":true,"ErrorOccurred":false,"EmailAddressValidationMessage":"","PasswordValidationMessage":""});

并且 jQuery 随后在读取它时会抛出一个解析器错误。

上面的响应看起来像有效的 JSON,根据文档,我认为“?callback =?” 适用于使用 JSONP 的 $.ajax 调用。

提前感谢您指出我显然缺少的内容:-)

4

2 回答 2

3

我在这里看到的几件事:

  1. 去掉 URL 中的回调参数。进行 jQuery JSONP 调用会添加自己的回调,并且将调用您的成功/错误函数。在后端,从请求中读取“回调”参数并使用它来包装您的 jsonp 响应(您已经在这样做了——所以不要更改那部分)。
  2. 当你进入你的成功函数时,serverData将是一个字符串。jQuery.parseJSON()用or解析它JSON.parse()

var data = jQuery.parseJSON(serverData); // 或者使用 JSON.parse(serverData);

那应该这样做。

最后一件事。如果您在解析时开始收到“Unexpected token...”错误,您的 JSON 字符串中可能隐藏了一个控制字符。我遇到了这个问题,它是一个换行符(“\n”)。通过让字符串在 Chrome 的开发工具控制台等中解析,找出它是哪个字符,然后替换它:

var data = jQuery.parseJSON(serverData.replace(/\n/g,""));
于 2013-07-16T13:36:03.343 回答
0

我在 MVC 操作方法响应中缺少下面的内容(将响应包装在回调方法中)。

response.Write(request.Params["callback"] +"(" +htmlContent +");");

jquery ajax 调用应该如下所示。

jQuery.ajax({
           url:"https://servername/virtualDirectory/ActionMethod,               
           crossDomain: true,
            dataType: 'jsonp',                  
            type: 'GET',
            cache: false,
            jsonp:"callback",              
            success: function (data) {   
                alert('success');                
                $fs("#fs_container").htm(data);                   
            },
            error: function (data, status, req) {                          
               alert(req.responseText + " " + status);
            }                 
});
于 2015-02-11T08:40:13.047 回答