Вызов веб-сервиса из jQuery не дает результатов

#jquery #asp.net #web-services

#jquery #asp.net #веб-сервисы

Вопрос:

Я пытаюсь получить доступ к веб-сервису из jQuery. Это работает нормально.Я смог сохранить данные в базе данных. Пока я пытаюсь получить данные из базы данных, я не вижу результата. При отладке я вижу, что элемент управления нажимает GetFileInfo(), но обратный вызов в jQuery не работает. Я попробовал ошибку bebugging в fire bug, я ничего не вижу в ответе в firebug. Что я делаю не так.

MyService.asmx:

  [WebMethod]
        public FileInfo[] GetFileInfo(int Id)
        {
            Proxies.ServiceRef.ServiceClient c = new Proxies.ServiceRef.ServiceClient();
            return c.GetFileInfo(Id).ToArray();
        }
  

реализация jquery на странице .aspx.

     this.ServiceProxy = function (serviceUrl) {
          var _I = this;
        this.serviceUrl = serviceUrl;
        this.isWcf = false;
        this.timeout = 10000;
        this.contentType = "application/json";

      this.invoke = function (method, params, callback, errorHandler) {
      var jsonData = _I.isWcf ? JSON.stringifyWcf(params) : JSON.stringify(params);

            // Service endpoint URL        
            var url = _I.serviceUrl   method;

            $.ajax({
                url: url,
                data: jsonData,
                type: "POST",
                contentType: _I.contentType,
                timeout: _I.timeout,
                dataType: "serviceproxy",  // custom type to avoid double parse
                dataFilter: function (jsonString, type) {
                    if (type == "serviceproxy") {
                        // Use json library so we can fix up dates        
                        var res = JSON.parseWithDate(jsonString);
                        if (res amp;amp; res.hasOwnProperty("d"))
                            res = res.d;
                        return res;
                    }
                    return jsonString;
                },
                success: function (result) {
                    if (callback)
                        callback(result);
                },
                error: function (xhr, status) {
                    var err = null;
                    if (xhr.readyState == 4) {
                        var res = xhr.responseText;
                        if (res amp;amp; res.charAt(0) == '{' amp;amp; status != "parsererror")
                            var err = JSON.parse(res);
                        if (!err) {
                            if (xhr.status amp;amp; xhr.status != 200)
                                err = new CallbackException(xhr.status   " "   xhr.statusText);
                            else {
                                if (status == "parsererror")
                                    status = "Unable to parse JSON response.";
                                else if (status == "timeout")
                                    status = "Request timed out.";
                                else if (status == "error")
                                    status = "Unknown error";
                                err = new CallbackException("Callback Error: "   status);
                            }
                            err.detail = res;
                        }
                    }
                    if (!err)
                        err = new CallbackException("Callback Error: "   status);

                    if (errorHandler)
                        errorHandler(err, _I, xhr);
                }
            });
        }
    }

var serviceUrl = "service/MyService.asmx/";
var proxy = new ServiceProxy(serviceUrl);

 function GetFileInfo() {

            proxy.invoke("GetFileInfo",
            { Id: $("#IAssignmentId").val() },
             function (result) {              
                    $.each(result, function (index) {

                  alert (this.Filename);

                 });
             }, onPageError);
  

Обновление 1 :

Ответ в формате Json.

 {"d":[{"__type":"Proxies.AFARServiceRef.AssignmentInfo","ExtensionData":{},"AssignDate":"/Date(1317748587667)/","AssignFileName":null,"ClaimId":"PA026195","ClaimantName":"Rachel Weiss","FirstContactDate":"/Date(1302678000000)/","FirstContactTime":{"Ticks":433800000000,"Days":0,"Hours":12,"Milliseconds":0,"Minutes":3,"Seconds":0,"TotalDays":0.50208333333333333,"TotalHours":12.049999999999999,"TotalMilliseconds":43380000,"TotalMinutes":723,"TotalSeconds":43380},"Id":5257,"InspectionDate":"/Date(1302246000000)/","StatusId":1,"SubmittedCount":5,"UploadedCount":9}]}
  

Ответ №1:

Похоже, что вы, вероятно, используете ASP.NET веб-сервис (asmx). Предполагая, что вы получаете правильный JSON из веб-сервиса (вы должны иметь возможность проверить это из firebug, просматривая ответ), я считаю, что проблема связана с вашей функцией обратного вызова success (попробуйте установить в нее точку останова). В службах asmx фактический результат переносится как свойство в результирующий объект JSON (чтобы избежать XSS), поэтому ваша функция успеха должна быть чем-то вроде

 success: function (result) {
    if (result) {
       // unwrap result
       result = result.d != undefined ? result.d : resu<
    }
    if (callback)
        callback(result);
},
  

Вышесказанное будет работать как для служб asmx, так и для WCF.

Комментарии:

1. Большое спасибо. Когда я отлаживаю с помощью firebug, я вижу ответ, и статус 200 ok. Я установил точку останова при успешном выполнении. Но как только я нажимаю F10, как только элемент управления достигает успеха:, элемент управления переходит к ошибке :. Я прикрепил ответ Json к вопросу.

2. @BumbleBee, установка точки останова в success: будет достигнута при вызове веб-сервиса. Вам нужно установить точку останова в функции успеха или обратного вызова — скажем, в строке $.each(result, function (index) { . В соответствующем примечании ваш ответ JSON не имеет FileName свойства, поэтому строка alert (this.Filename); вызовет проблему. Измените это на alert(this.AssignFileName); но имейте в виду, что ваш пример ответа имеет то же значение null.

3. Установил точку останова, как упоминалось, но никогда не достигает точки останова. Я не знаю, как это сделать.

Ответ №2:

Это класс FileInfo из системы.Пространство имен ввода-вывода или пользовательский класс с тем же именем?

Если это так, то, скорее всего, веб-сервис выдает исключение при попытке сериализовать массив, поскольку класс FileInfo не может быть сериализован, поскольку у него нет конструктора без параметров.

Комментарии:

1. Спасибо. когда я выполняю отладку в firebug, я вижу, что при успешном выполнении выдается ошибка: функция (результат) {}. Я не могу понять, в чем ошибка. Когда я попытался перейти, это не привело к ошибке.