【问题标题】:$.getJSON not executing success callback for WCF service call$.getJSON 不执行 WCF 服务调用的成功回调
【发布时间】:2014-03-20 15:54:16
【问题描述】:

我正在使用 $.getJSON() 通过 jQuery 调用本地 IIS 上托管的 WCF 服务。

看看我的java脚本代码

getTestRunsByProject: function (projectKey) {
        var deferred = $.Deferred();
        var link = scnfg.ServiceURL + '/GetTestRunsForProject/' + projectKey + '?callback=?';
        $.getJSON(link, function (results) {
            deferred.resolve(results);
        });
        return deferred.promise();
    },

我在哪里附加了 ?callback=?在服务 url 结束时,因为我在 firebug 控制台选项卡中收到带有红色文本的 200 状态代码的空响应;虽然服务正常。

当使用字符串 ?callback=? 修改 url 时然后我没有在 firebug 控制台选项卡中获得服务调用条目,而是在 firebug 的 Net 选项卡中找到了服务调用详细信息,其中包含来自服务的所需响应。

我正在使用以下脚本代码调用此函数

$.when(serviceapi.getTestRunsByProject("W6")).then(function (data) {
        if (data.length > 0) {
            lstTestRuns = data;
        }
    });

现在使用 ?callback=?它确实从服务调用返回响应当在 firebug Net 选项卡中检查时,但 $.getJSON 的成功回调没有被触发,即它不返回 $.Deffered() 对象。使用 ?callback=?这就是为什么服务调用条目没有记录在 firebug 控制台选项卡中的原因。

有人可以帮忙吗? 提前致谢。

【问题讨论】:

  • 您是否安装了错误处理程序并查看 jQuery 是否报告了特定的错误情况?您的 Web 服务是否特别支持将结果打包到 javascript 函数调用中的 JSONP?
  • 另外,您不需要在这里创建自己的延迟对象。 $.getJSON() 返回一个 Promise 兼容对象,该对象将自动被 ajax 调用解析或失败。
  • @jfriend00 感谢您的回复。我已将属性添加到服务合同以返回 json 格式的响应,如下所示 [OperationContract] [WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "GetTestRunsForProject/{projectKey}")] List GetTestRunsForProject(string projectKey);请告诉我是否需要做更多的事情?
  • JSONP 格式不同于 JSON。您必须明确知道客户端正在请求哪一个并生成正确的。在 URL 中使用 callback= 通常意味着 JSONP 用于跨域使用。
  • 我没有特别要求 JSONP 格式使用 callback=。但是,当我删除它时,我会得到空的响应,正如我在问题陈述中已经描述的那样。所以现在如果我只需要通过删除 callback= 来回复 JSON 格式,那么我怎样才能实现我的服务调用以返回所需的响应。否则,如果我需要使用 JSONP,那么如何添加对 WCF 服务的支持?

标签: jquery wcf getjson


【解决方案1】:

使用 ?callback=?我正在实现对我的服务的跨域调用,但从服务端我返回的是纯 json 格式的结果。因此,在这种情况下,服务客户端请求 JSONP 格式的数据,而我的服务返回 JSON 格式的数据。根据 jfriend00 的建议,我搜索了如何实现 JSONP 机制并找到了有用的this 链接。

参考此链接我知道我需要为我的服务端点设置绑定配置以启用 corss 域调用。为此,我在我的服务配置文件中添加了以下标记

<bindings>
  <webHttpBinding>
    <binding name="webHttpBindingWithJSONP" crossDomainScriptAccessEnabled="true" />
  </webHttpBinding>
</bindings>

并更新了我的端点定义以使用此绑定配置,如下所示

<endpoint address="" binding="webHttpBinding" contract="IAuFaitDashboard" bindingConfiguration="webHttpBindingWithJSONP" behaviorConfiguration="MySetting">

然后我的 java 脚本 getTestRunsByProject 函数开始按预期执行。

【讨论】:

    猜你喜欢
    • 2012-09-01
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 2011-08-22
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多