JSONP + jQuery:由于错误80020101无法完成操作

时间:2012-04-23 15:56:16

标签: jquery wcf jsonp

我有一个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),它会抛出上述异常。

任何想法我做错了什么?

3 个答案:

答案 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