【问题标题】:.JQuery .ajax how do I call WCF method with return value?.JQuery .ajax 如何使用返回值调用 WCF 方法?
【发布时间】:2014-03-19 14:47:00
【问题描述】:

我已经能够使用 .ajax 调用 WCF 方法。如何调用返回值的方法?我需要调用这个方法来查看数据是否准备好,如果没有等待一秒钟。 WCF方法是:

 [OperationContract]
        [WebGet]
        public bool IsDataReady(string requestGUID)
        {
            if (Global.publicDataDictionary.Keys.Contains(requestGUID))
                return true;
            else return false;
        }

到目前为止,我的 JavaScript 是:

$(document).ready(function() {
            var input = {requestGUID:"<%=guid %>"};
            console.log(input);

            $.ajax({
                url: "http://www.blah.com/services/TestsService.svc/IsDataReady",
                type: "GET",
                contentType: "application/json; charset=utf-8",
                data: input,
                dataType: "json",
                success: function(data) {

                }
            });

EDIT2:我将第二个 ajax 调用分解为一个方法,但我的日志显示对第二个 Web 服务的调用从未传递 requestGUID。我不能使用相同的输入变量吗?

   var guid = "<%= this.guid%>";
        // var input = '{"SbiId":"' + guid + '"}';
        // var input = {requestGUID:"ca222cf7-be5e-431a-ab93-9a31e8ae2f4a"};

        function callUpdateGrid(input) {
            console.log(input);
            $.ajax({
                url: "http://www.blah.com/services/TestsService.svc/GetContactsDataAndCountbyGUID",
                type: "GET",
                contentType: "application/json; charset=utf-8",
                data: input,
                dataType: "json",
                success: function (data) {
                    var mtv = $find("<%= RadGrid1.ClientID %>").get_masterTableView();
                                console.log(data);
                                mtv.set_dataSource(data.d.Data);
                                mtv.dataBind();
                            }
            });
        }


        function CallIsDataReady(input) {
            $.ajax({
                url: "http://www.blah.com/services/TestsService.svc/IsDataReady",
                type: "GET",
                contentType: "application/json; charset=utf-8",
                data: input,
                dataType: "json",
                success: function (data) {
                    if (!data) {
                        setTimeout(function (inputInner) { CallIsDataReady(inputInner); }, 1000);
                    }
                    else {
                        //Continue as data is ready
                        callUpdateGrid(input);
                    }
                }
            });
        }

        $(document).ready(function () {
            var input = { requestGUID: "<%=guid %>" };

            CallIsDataReady(input);

        });

EDIT2:我将第二个 ajax 调用分解为一个方法,但我的日志显示对第二个 Web 服务的调用从未被调用:

url: "http://www.blah.com/services/TestsService.svc/GetContactsDataAndCountbyGUID",

else {
                            //Continue as data is ready
                            callUpdateGrid(input);
                        }

【问题讨论】:

  • 你进入success了吗?

标签: c# javascript jquery ajax wcf


【解决方案1】:

返回值将包含在传递给您的 ajax 调用中的成功回调设置的数据参数中。

你需要检查这里的值,如果为假,设置一个超时,到期时会再次尝试ajax调用。

IMO 最好将 Ajax 调用封装在一个函数中,当超时过期时,您可以以递归方式调用该函数。例如

    function CallIsDataReady(input){
        $.ajax({
            url: "http://www.blah.com/services/TestsService.svc/IsDataReady",
            type: "GET",
            contentType: "application/json; charset=utf-8",
            data: input,
            dataType: "json",
            success: function(data) {
                if (!data){
                    setTimeout(function(){CallIsDataReady(input);}, 1000);
                }
                else{
                  //Continue as data is ready
                }
            }
        });
    }
    $(document).ready(function() {
        var input = {requestGUID:"<%=guid %>"};
        console.log(input);

        CallIsDataReady(input);
    });

【讨论】:

  • 我无法让它工作。我认为这是我第二次重复同名参数的 .ajax 调用。我要更新我的问题
  • 我把它分解成一个函数来进行第二次 AJAX 调用并进行了更改,但它仍然不起作用。我会编辑。
  • 知道为什么吗?你调试了吗?
  • 代码不是本地的,而是在服务器上,所以我无法调试它。但是我确实使用了 IE DEv 工具并在 callUpdateGrid 上设置了断点,但我无法让它命中。
  • 我的日志显示第二个函数和第二个 AJAX 调用从未获得 requestGUID 值。我不能用相同的输入值调用第二个函数吗?
【解决方案2】:

当您在此页面上查看源代码时:

var input = {requestGUID:"<%=guid %>"};

在 javascript 中正确显示?如果您在 IsDataReady 方法中放置断点,您是否看到 requestGUID 是否有值?您的服务与调用它的页面是否在同一个域中?

编辑: 在您的服务更改中:[WebGet] 到:

[WebGet(
RequestFormat=WebMessageFormat.Json,
ResponseFormat=WebMessageFormat.Json]

阅读 RESTful Web 服务: http://www.codeproject.com/Articles/105273/Create-RESTful-WCF-Service-API-Step-By-Step-Guide

【讨论】:

  • 我看到我的 IsDataReady 返回了看起来是 XML 的内容,即使该服务是 JSON 服务并且为 JSOn 设置了 .ajax 调用 schemas.microsoft.com/2003/10/Serialization/">true</…>
猜你喜欢
  • 2016-09-17
  • 1970-01-01
  • 2011-01-04
  • 2011-03-04
  • 2011-09-21
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多