Получение ошибки в скрипте при возврате данных из службы WCF

Я пытаюсь вернуть данные из службы wcf. Я написал услугу. Код для него, как показано ниже

 [WebInvoke(Method = "PUT", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "TableData")]
    public DataTable GetData(Parameters param)
    {
        try
        {


            var Id = int.Parse(param.Id);
            var tableName = param.TableName;
            var listSelectCol = new ArrayList();
            bool bFirst = true;
            var sSelectColList = new StringBuilder();
            var Query ="";
            var List = from TableEntity in _TableEntityRepository.AsQueryable()
                                  join ColumnEntity in _ColumnEntityRepository.AsQueryable() on TableEntity.Id equals ColumnEntity.Id
                                  where sysTableEntity.TableName.Equals(tableName)
                                  select ColumnEntity.Name;



            foreach (var x in List 
            {
                if (bFirst)
                    bFirst = false;
                else
                    sSelectColList.Append(", ");

                sSelectColList.Append("t." + x.ToString(CultureInfo.InvariantCulture));
                listSelectCol.Add(x.ToString(CultureInfo.InvariantCulture));


            }

                 Query =
                    "select " + sSelectColList + " ,  t.Name as MyName  from  " + tableName +
                    " t   Where t.Id = " + Id;





            var cmdQuery = new SqlCommand(Query, new SqlConnection(ConfigurationManager.AppSettings.Get("connectionString")));
            var sdaQuery = new SqlDataAdapter(cmdQuery);
            var diffTableFrom = new DiffTable();
            var colValues = new DataColumn("ColValues", typeof(System.String));

            var dt = new DataTable();
            dt.Columns.Add(colValues);

            sdaQuery.Fill(dt);

            diffTableFrom.ReturnDiffTable = dt;

            foreach (DataRow row1 in dt.Rows) 
            {
                foreach (string i in listSelectCol)
                {
                    row1["ColValues"] = row1["ColValues"] + row1[i].ToString() + ",";

                }
                row1["ColValues"] = row1["ColValues"].ToString().Remove(row1["ColValues"].ToString().Length - 1);


            }


            return dt;

        }

        catch (Exception e)
        {



            throw new WebFaultException<string>(
        string.Format(
            "{0}{1}",
            e.Message, (e.InnerException != null ? e.InnerException.Message : string.Empty)), HttpStatusCode.BadRequest);
        }


    }

Класс для DiffTable -

  public class DiffTable
    {
        public DataTable ReturnDiffTable {get;set;}
    }

Код для вызова из моей модели просмотра:

function loadData(id, tablename) {
        debugger;

        var input =
       {

           TableName: tableName,
           Id: id

       };


        return $.ajax({
            url: "../Service/TableData",
            type: "PUT",
            contentType: 'application/json',
            processData: false,
            data: JSON.stringify(input),
            error: function (XMLHttpRequest, textStatus, errorThrown) {

                alert(errorThrown);
            },
           success: function (allData) {
                var mappedData = $.map(allData, function (item) {
                    return new TableChangesDetail(item);

                });

                self.TableChangesDetailList(mappedData);


            }

        });

    }

Когда я пытаюсь вызвать эту службу из моей модели просмотра с помощью ajax, я получаю ошибку в скрипте как [Fiddler] ReadResponse() failed: The server did not return a response for this request.

Как мне вернуть данные из службы wcf? Когда я отлаживаю службу и ставлю точку останова на return dt; тогда я получаю 1 строку. Таким образом, данные возвращаются из базы данных, но не обратно в модель просмотра.

Что я здесь делаю не так?

ОБНОВЛЕНИЕ1

После того, как я изменил эту строку, написанную в моем сервисе

var dt = new DataTable(); 

to

var dt = new DataTable("Test");

Я сейчас не получаю никаких ошибок. Но скрипач не получает данные в формате json. Когда я открываю скрипач и вижу данные на вкладке TextView в каком-то странном формате. Это причина того, что я не попадаю в мою нокаут-модель. Как мне исправить это сейчас?


person DevelopmentIsMyPassion    schedule 22.07.2013    source источник
comment
Я бы посоветовал вам включить отслеживание неудачных запросов, чтобы попытаться понять, что не удается сериализовать. Также вы можете рассмотреть возможность использования класса DTO для привязки к вашей модели вместо таблицы данных. Может быть легко реализовать и избежать этой проблемы.   -  person Andrew Walters    schedule 22.07.2013
comment
@AndrewWalters, как использовать класс DTO?   -  person DevelopmentIsMyPassion    schedule 22.07.2013
comment
@AndrewWalters Я использую datatable, потому что мне нужно возвращать динамические столбцы из таблицы. Мои столбцы меняются каждый раз в зависимости от того, что передается от пользователя. Следовательно, я использовал datatable. Не уверен, что DTO справится с этим, потому что я ничего об этом не знаю   -  person DevelopmentIsMyPassion    schedule 22.07.2013
comment
@AshReva Сообщите нам, что появляется трассировка запроса :-)   -  person Andrew Walters    schedule 22.07.2013
comment
@AndrewWalters Пожалуйста, посмотрите мое обновление   -  person DevelopmentIsMyPassion    schedule 22.07.2013
comment
@AshReva. Думаю, на вкладках Raw и JSON в скрипте тоже нет ничего нормального? Код состояния в ответе 200?   -  person Andrew Walters    schedule 22.07.2013
comment
@AndrewWalters Ответ показывает что-то как 2243, но не 200   -  person DevelopmentIsMyPassion    schedule 22.07.2013
comment
@AndrewWalters Когда я нажимаю на вкладку заголовков, я получаю HTTP / 1.1 200 ОК   -  person DevelopmentIsMyPassion    schedule 22.07.2013
comment
@AshReva Думаю, вам, возможно, придется запустить эту трассировку запроса и посмотреть, есть ли проглоченные исключения сериализации   -  person Andrew Walters    schedule 22.07.2013


Ответы (1)


Мне удалось найти другой способ. Я не уверен, что это разумно. Что я сделал, так это преобразовал эту таблицу данных в список и список возврата. Итак, я добавил код ниже в свой сервис

foreach (DataRow row1 in dt.Rows) 
            {
                var list = new LookUpTable();
                list.Name = (string) row1["Name"];
                list.Id = row1["Id"];
                myReturnList.Add(list);


            }


return myReturnList.ToList();
person DevelopmentIsMyPassion    schedule 22.07.2013