Служба WCF принимает простую строку JSON, но отклоняет набор JSON с ошибкой 400 - PullRequest
6 голосов
/ 22 февраля 2012

В настоящее время я работаю над приложением PhoneGap, которое связывается с нашей базой данных через веб-сервис WCF.

Я сделал много запросов к серверу и получил данные без проблем, но в каждом случае я передавал только пару параметров в виде строки JSON, которую я создал вручную (без stringify).Теперь я столкнулся с проблемой при попытке прочитать из моей локальной базы данных SQLite и затем отправить информацию в виде JSON в веб-службу.Служба возвращает ошибку 400 со следующим:

Ошибка в десериализации тела сообщения запроса для операции uploadData.OperationFormatter обнаружил недопустимое тело сообщения.Ожидается найти атрибут с именем «тип» и значением «объект».Найденное значение 'массив'.

Я кодирую JSON следующим образом:

database.transaction(function(tx) {
    var query = "SELECT * FROM someTable WHERE something=something";
    tx.executeSql(query, [], function(tx, results) {
        var resultSet = new Array();

        for (i=0; i<results.rows.length; i++) {
            var row = results.rows.item(i);
            resultSet[i] = row;         
        }

        var json = JSON.stringify(resultSet);
    }
}

Затем я отправляю строку JSON через запрос ajax, используя jQuery:

$.ajax({
            type: "POST",
            url: "http://someurl/myService.svc/uploadData",
            contentType: "application/json; charset=utf-8",
            data: json,
            dataType: "json",
            success: function (data) {/*do something*/}, 
            error: function(jqXHR, textStatus, errorThrown) {
                $('#test').html(textStatus + " - " + errorThrown + " - " + jqXHR.responseText);
            }
        }); 

Мой веб-сервис просто продолжает выдавать ту же ошибку.Мой вопрос заключается в следующем ... Как я могу прочитать из локальной базы данных и преобразовать результирующий набор в пригодную для использования строку JSON для отправки через ajax.

Заранее спасибо.Если требуется дополнительная информация или проблема неясна, пожалуйста, дайте мне знать, и я сделаю все возможное, чтобы предоставить дополнительную информацию.

РЕДАКТИРОВАТЬ: Попытка удаления строки, но я все еще получаюОшибка 400На этот раз ошибка немного отличается:

Ошибка в десериализации тела сообщения запроса для операции uploadData.OperationFormatter обнаружил недопустимое тело сообщения.Обнаружен неожиданный символ 'u'.

РЕДАКТИРОВАТЬ: Я обнаружил, что даже созданная вручную строка JSON, которая является абсолютно допустимой, по-прежнему вызывает ошибку.Это не происходит при отправке нескольких параметров, таких как:

{"name" : "dean", "age" : 23}

. Это прекрасно работает.Он только отклоняет наборы результатов, такие как:

[{"name" : "dean", "age" : 23},{"name" : "bob", "age" : 25}]

Метод определен в интерфейсе WCF следующим образом:

 [OperationContract]
 [WebInvoke(Method = "POST",
          BodyStyle = WebMessageBodyStyle.Wrapped,
          ResponseFormat = WebMessageFormat.Json,
          RequestFormat = WebMessageFormat.Json)]

 string uploadData(string data);

Кажется, это больше проблема со службой WCF, чемСама строка JSON.Кто-нибудь знает, почему WCF принимает простую строку JSON, но отклоняет набор?Это серьезная проблема, которая полностью остановила разработку проекта, поэтому любая помощь будет принята с благодарностью!

решено: Вместо прямой передачи закодированной строки JSON, которую я вместо этого отправил, в качестве значениядругой строки JSON с ключом «данные».Итак, как и выше, у меня есть результаты SQLite:

var json = JSON.stringify(resultSet);

Затем я передаю их службе WCF следующим образом:

...
data: JSON.stringify({ data : json }),
...

И теперь она работает нормально.

1 Ответ

0 голосов
/ 22 февраля 2012

Шаг JSON.stringify не нужен, потому что движок jQuery AJAX делает это автоматически. Просто передайте массив результирующего набора как свойство data в параметрах запроса:

...
data: resultSet,
...

То, что вы сейчас делаете, - это структурирование массива в JSON, а затем запрос jQuery переопределить эту результирующую строку как JSON перед отправкой на сервер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...