我有一个WCF JSONP服务,我试图利用jQuery(v 1.7.2)。
服务器端代码:
[OperationContract]
[WebGet(BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
[JSONPBehavior(callback = "method")]
List<string> GetList()
{
return new List<string> {"test1", "test2"};
}
客户端代码:
function showList()
{
$.ajax({
url: 'http://mysite/myservice.svc/GetList',
dataType: 'jsonp',
data: { },
contentType: "application/json",
success: function (m)
{
debugger;
},
error: function (err)
{
debugger;
}
});
}
会发生什么:调用'错误'回调,当我检查err
参数时,其err.responseText
包含正确的JSON响应:{"GetListResult":["test1","test2"]}
为了看看发生了什么,我开始调试jQuery本身,我看到它无法转换结果ajaxConvert
方法:
jQuery 1.7.2(未最小化),第7511行:success = ajaxConvert( s, response );
那些异常Could not complete the operation due to error 80020101.
。
当我单步执行ajaxConvert
时,我发现它会尝试jQuery.globalEval(response)
,它会抛出上述异常。
任何想法我做错了什么?
答案 0 :(得分:0)
JSON输出是否包含在回调函数中? JSONP的一个关键部分是它本质上将json数据传递给一个被执行到javascript范围的函数。
函数的名称应该由jQuery自动附加到请求URL,即请求应该是:http://mysite/myservice.svc/GetList?callback=jQuery_random1231
然后你的JSONP输出应为:
jQuery_random1231({ key: 'value', key1: 'value1' .. });
你的后端显然必须迎合这一点。
答案 1 :(得分:0)
我认为问题在于您的服务不是返回JSONP而是返回JSON。 eval函数尝试将字符串计算为JavaScript代码 - 如果它是JSONP格式,则该函数将成功进行评估。实际的JSONP响应应该是:method({“GetListResult”:[“test1”,“test2”]})。
我想您正在使用MSDN sample here.
中的JSONPBehavior您可以尝试调试行为以查看它是否正常工作。就个人而言,在将原始流序列化为JSONP时,我遇到了这个类的问题。
如果您使用的是.NET 4,则不再需要使用此行为。您可以改为在web.config中更改绑定的配置:
<binding name="webHttpBindingWithJsonP" crossDomainScriptAccessEnabled="true" />
您可能尝试的另一件事是使用getJson方法而不是ajax方法。我正在使用JSONP,它可以工作。
干杯, 扬
答案 2 :(得分:0)
我不知道您是否找到了解决方案,但这可能有所帮助。我有同样的问题,并使用调试器跟踪事情。我最终发现原因是查询字符串参数。一旦我从webservice调用中删除了querystring参数,一切正常。我希望这有帮助
http://senseicris.wordpress.com/2012/05/19/jquery-error-80020101-a-fix