【问题标题】:JSONP+jQuery : Could not complete the operation due to error 80020101JSONP+jQuery : 由于错误 80020101 无法完成操作
【发布时间】:2012-05-26 17:36:02
【问题描述】:

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

任何想法我做错了什么?

【问题讨论】:

  • 你确定你的dataType 应该是“jsonp”吗?如果将其设置为 "json" 怎么办?我不认为你在做 jsonp。见en.wikipedia.org/wiki/JSONP
  • 我需要进行跨域调用 - wcf 服务与客户端页面位于不同的域中;因此我需要一个 JSONP 调用。

标签: jquery wcf jsonp


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    我认为问题在于您的服务没有返回 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 一起使用,它可以工作。

    干杯, 一月

    【讨论】:

    • 你是对的,我正在使用那个例子。不幸的是,我不能使用 .NET 4.0。那么,如果我使用 getJSON() 它仍然可以跨域工作吗?
    • 是的,在我的场景中,我使用 getJson() 进行跨域调用。但我认为这更多的是服务器端问题。您甚至可以使用 Chrome 验证是否正确返回了 JSONP 或返回了纯 JSON。如果您确定服务器返回 JSONP,则转到 jQuery 调试 :)。但不是之前
    • 看起来服务器正在返回 JSON,因为响应只是 json 字符串。我按照微软的例子,不知道出了什么问题。
    • OK 实际上要测试 JSONP 是否正常工作,您必须编写正确的 url。例如,对于这样的 URL:server/myservice?callback=wrapper,您应该收到如下响应:wrapper(..original JSON here...)。所以你可以使用 jQuery 的 getJSON 方法,但你必须在最后添加 ?callback=wrapper 。检查关于这个的 jQuery 文档。 api.jquery.com/jQuery.getJSON
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-25
      • 1970-01-01
      • 1970-01-01
      • 2014-03-20
      • 2012-04-28
      相关资源
      最近更新 更多