0

我有一个 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)会引发上述异常。

任何想法我做错了什么?

4

3 回答 3

0

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

http://senseicris.wordpress.com/2012/05/19/jquery-error-80020101-a-fix

于 2012-05-26T09:36:02.613 回答
0

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

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

那么你的 JSONP 输出应该是这样的:

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

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

于 2012-04-23T16:31:43.223 回答
0

我认为问题在于您的服务没有返回 JSONP,而是返回 JSON。eval 函数尝试将字符串评估为 JavaScript 代码 - 如果那将是 JSONP 格式,则该函数将通过评估成功。实际的 JSONP 响应应该是:method({"GetListResult":["test1","test2"]})。

我想您在这里使用的是 MSDN 示例中的 JSONPBehavior 。

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

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

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

您可能会尝试的另一件事是使用getJson方法而不是 ajax 方法。我将那个与 JSONP 一起使用,它可以工作。

干杯,简

于 2012-04-24T07:40:09.137 回答