6 Stimmen

WCF Service akzeptiert einfachen JSON-String, lehnt aber JSON-Set mit 400-Fehler ab

Ich arbeite derzeit an einer PhoneGap-App, die mit unserer Datenbank über einen WCF-Webdienst kommuniziert.

Ich habe viele Anfragen an den Server und abgerufenen Daten mit kein Problem, aber in jedem Fall war ich nur in ein paar Parameter als JSON-String übergeben, die ich manuell erstellt (keine stringify). Jetzt bin ich auf ein Problem gestoßen, als ich versucht habe, aus meiner lokalen SQLite-Datenbank zu lesen und die Informationen dann als JSON an den Webdienst zu senden. Der Dienst gibt einen 400-Fehler mit dem folgenden zurück:

Fehler beim Deserialisieren des Körpers der Anforderungsnachricht für die Operation 'uploadData'. OperationFormatter hat einen ungültigen Nachrichtentext gefunden. Es wurde erwartet, ein Attribut mit dem Namen 'type' und dem Wert 'object' zu finden. Gefundener Wert 'array'.

Ich kodiere das JSON wie folgt:

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);
    }
}

Dann sende ich den JSON-String über eine Ajax-Anfrage mit 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);
            }
        }); 

Mein Webdienst meldet immer wieder denselben Fehler. Meine Frage ist diese... Wie kann ich aus der lokalen Datenbank lesen und konvertieren die Ergebnismenge in eine verwendbare JSON-Zeichenfolge über Ajax gesendet werden.

Vielen Dank im Voraus. Wenn Sie weitere Informationen benötigen oder das Problem unklar ist, lassen Sie es mich bitte wissen, und ich werde mein Bestes tun, um weitere Informationen zu liefern.

EDIT: Ich habe versucht, das Stringify zu entfernen, aber ich erhalte immer noch einen 400-Fehler. Der Fehler ist dieses Mal allerdings ein wenig anders:

Fehler beim Deserialisieren des Körpers der Anforderungsnachricht für die Operation 'uploadData'. OperationFormatter traf auf einen ungültigen Nachrichtentext. Unerwartetes Zeichen 'u' gefunden.

EDIT: Ich habe festgestellt, dass selbst eine manuell erstellte JSON-Zeichenfolge, die vollkommen gültig ist, den Fehler verursacht. Es passiert nicht, wenn ein paar Parameter wie senden:

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

Es funktioniert einwandfrei. Es lehnt nur Gruppen von Ergebnissen ab, wie z. B.:

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

Die Methode ist in der WCF-Schnittstelle wie folgt definiert:

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

 string uploadData(string data);

Es scheint eher ein Problem mit dem WCF-Dienst als mit der JSON-Zeichenfolge selbst zu sein. Weiß jemand, warum WCF eine einfache JSON-Zeichenfolge akzeptiert, aber ein Set ablehnt? Dies ist ein großes Problem, das die Entwicklung des Projekts vollständig gestoppt hat, so dass jede Hilfe sehr geschätzt wird!

GELÖST: Anstatt die kodierte JSON-Zeichenfolge direkt zu übergeben, habe ich sie als Wert einer anderen JSON-Zeichenfolge mit dem Schlüssel "data" gesendet. Also, wie oben habe ich meine SQLite Ergebnisse als:

var json = JSON.stringify(resultSet);

Ich übergebe sie dann wie folgt an den WCF-Dienst:

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

Und jetzt funktioniert es einwandfrei.

-1voto

Matthew Punkte 14726

En JSON.stringify Schritt ist unnötig, da die AJAX-Engine von jQuery dies automatisch erledigt. Übergeben Sie einfach das Array der Ergebnismenge als data Eigenschaft in den Anfrageoptionen:

...
data: resultSet,
...

Was Sie jetzt tun, ist Stringifying ein Array zu JSON, dann fragen Sie jQuery, um die resultierende Zeichenfolge als JSON vor dem Senden an den Server umzuwandeln.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X