JSONP&x2B;jQuery:由于错误80020101,无法完成操作

JSONP&x2B;jQuery:由于错误80020101,无法完成操作,jquery,wcf,jsonp,Jquery,Wcf,Jsonp,我有一个WCFJSONP服务,我正试图利用jQuery(V1.7.2) 服务器端代码: [OperationContract] [WebGet(BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)] [JSONPBehavior(callback = "method")] List<string> GetList() { return new List<stri

我有一个WCFJSONP服务,我正试图利用jQuery(V1.7.2)

服务器端代码:

[OperationContract]
[WebGet(BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]

[JSONPBehavior(callback = "method")]
List<string> GetList()
{
    return new List<string> {"test1", "test2"};
}
发生的情况是:调用“error”回调,当我检查
err
参数时,它的
err.responseText
包含正确的JSON响应:
{“GetListResult”:[“test1”、“test2”]}

为了了解发生了什么,我开始调试jQuery本身,我看到它无法转换结果
ajaxConvert
方法:

jQuery 1.7.2(未最小化),第7511行:
success=ajaxConvert(s,响应)由于错误80020101,这些异常
无法完成操作。

当我单步执行
ajaxConvert
时,我看到它试图执行
jQuery.globalEval(response)
,这会引发前面提到的异常


知道我做错了什么吗?

JSON输出是否包装在回调函数中?JSONP的一个关键部分是,它本质上是将json数据传递给在javascript范围内执行的函数

函数名应该由jQuery自动附加到请求URL上,即请求应该是:
http://mysite/myservice.svc/GetList?callback=jQuery_random1231

那么您的JSONP输出应该是:

jQuery_random1231({ key: 'value', key1: 'value1' .. });

您的后端显然必须满足这一要求。

我认为问题在于您的服务不是返回JSONP,而是返回JSON。eval函数尝试将字符串作为JavaScript代码进行求值-如果是JSONP格式,则该函数将成功求值。实际的JSONP响应应该是:method({“GetListResult”:[“test1”、“test2”]})

我想您使用的是来自

您可以尝试调试该行为,看看它是否正常工作。我个人在将原始流序列化到JSONP时遇到了这个类的问题

如果您在.NET4中,则不需要再使用此行为。您可以改为在web.config中更改绑定的配置:

<binding name="webHttpBindingWithJsonP" crossDomainScriptAccessEnabled="true" />

您可以尝试的另一件事是使用该方法而不是ajax方法。我将它与JSONP一起使用,它很有效

干杯,
Jan

我不知道您是否找到了解决方案,但这可能会有所帮助。我也遇到了同样的问题,并通过调试器追踪到了问题所在。我最终发现原因是一个查询字符串参数。一旦我从webservice调用中删除querystring参数,一切都正常了。我希望这有帮助


您确定您的
数据类型应该是“jsonp”吗?如果将其设置为“json”会怎么样?我不认为你在做jsonp。请参阅我需要进行跨域调用-wcf服务位于与客户端页面不同的域中;因此,我需要一个JSONP调用。不幸的是,我不能使用.NET4.0。所以,如果我使用getJSON(),它是否仍然可以跨域工作?是的,在我的场景中,我使用getJSON()进行跨域调用。但我认为更多的是服务器端问题。您甚至可以使用Chrome验证是否正确返回了JSONP,或者是否返回了纯JSON。如果您确定服务器返回JSONP,则转到jQuery调试:)。但在此之前,服务器似乎正在返回JSON,因为响应只是JSON字符串。我遵循了Microsoft的示例,不确定出了什么问题。好的,实际上要测试JSONP是否正常工作,您必须编写正确的url。例如,对于这样的URL:您应该收到如下响应:wrapper(…此处为原始JSON…)。因此,您可以使用jQuery的getJSON方法,但必须在末尾添加?callback=wrapper。检查这一页上的jQuery文档。
<binding name="webHttpBindingWithJsonP" crossDomainScriptAccessEnabled="true" />