4 Stimmen

Bessere Fehlermeldung von ASP.Net [WebMethod], die von JQuery aufgerufen wird

[HINWEIS: Ich bin hier wirklich auf der Suche nach einigen guten Debugging-Techniken. Vielleicht einige Tricks oder Möglichkeiten zur Vereinfachung der Dinge, die ich nicht kenne].

Ich bin mit der Technik des Aufrufs [WebMethods] definiert in einer ASPX-Seite von JQuery wie erwähnt aquí y aquí . Dies scheint eine immer häufiger angewandte Methode zu sein.

Ich benutze es schon eine Weile und es funktioniert im Allgemeinen gut. Aber während der Entwicklung ist es ziemlich anfällig. Jeder falsche Parameter führt zu einer sehr vagen, unspezifischen Fehlermeldung. Zum Beispiel, wenn ich eine ziemlich komplexe Web-Methode als definiert haben:

[WebMethod]
public static string SaveComplexRecord(int recID, GeneralData general, SomeObject data, SomeOtherObject moreData)
{
   //do a bunch of stuff with that data
}

Und GeneralData, SomeObject und SomeOtherObject haben alle eine Mischung aus verschiedenen Arten von Parametern (Strings, Ints, Bools, Datetimes.) Es ist sehr wahrscheinlich, vor allem während der anfänglichen Entwicklung, dass ich das JSON auf der Client-Seite falsch erstellen werde. Vielleicht werde ich dies tun:

var data = {
    recID: curID,
    general:
    {
        a: aValue,
        b: bValue,
        c: cValue
    },
    data:
    {
        d: dValue,
        e: eValue,
        f: fValue
    },
    moredata:
    {
        g: gValue,
        h: hValue,
        i: iValue
    }
};

Dies führt zu einem Fehler, da der Name des dritten Parameters moreData und nicht moredata lautet. Und das ist nur ein Beispiel, es könnte noch hundert andere subtile Tippfehler geben.

Wenn ich diese Methode von C# aus aufrufen würde, würde der Compiler eine Fehlermeldung wie "No overloaded method of SaveComplexRecord takes three parameters." oder eine andere hilfreiche Meldung ausgeben, die Sie in die richtige Richtung weist.

Also... gibt es eine Möglichkeit, ASP.Net dazu zu bringen, hier bessere Fehlermeldungen zu produzieren?

Oder gibt es ein Dienstprogramm, das automatisch die JSON-Parameterstruktur eines [WebMethod]-Aufrufs erstellt? (genau wie man automatisch die WSDL eines Webdienstes abrufen kann)

...oder eine andere Technik, die ich vielleicht übersehen habe?

Und der Vollständigkeit halber hier ist, wie ich diese WebMethods von JQuery aus aufrufe:

   var jsondata = $.toJSON(data);

    $.ajax({
        type: "POST",
        url: "MyWebPage.aspx/SaveComplexRecord",
        data: jsondata,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        beforeSend: function(xhr)
        {
            xhr.setRequestHeader("Content-type",
                         "application/json; charset=utf-8");
        },
        success: function(msg)
        {
            //do something on success
        },
        error: function(XMLHttpRequest, textStatus, errorThrown)
        {
            alert("ERROR status:" + textStatus + " error:" + errorThrown);
        }

    });

1voto

Chris Fewtrell Punkte 7227

Oder gibt es ein Dienstprogramm, das automatisch die JSON-Parameterstruktur eines [WebMethod]-Aufrufs erstellt? (genau wie man automatisch die WSDL eines Webdienstes abrufen kann)

Ja! Das ASP.Net AJAX-Framework kann dies tun! Sie könnten das Framework dazu bringen, clientseitige Proxy-Klassen zu erzeugen für GeneralData , SomeObject y SomeOtherObject Klassen unter Verwendung des Attributs "GenerateScriptType" einer Webdienstklasse.
Siehe asp net ajax web dienste verstehen für einen sehr guten Artikel über dieses Thema.

[Leider, AFAIAA, ist die GenerateScriptType hat keine Wirkung, wenn sie auf die Klasse Page angewendet wird, in der Ihre Seitenmethode definiert ist - Sie müssen also eine reine .asmx hinzufügen, um die Proxy-Erzeugung zu erhalten].

Sie könnten diese Klassen vielleicht verwenden, um die data Struktur, die Sie dann beim Aufruf von JSON stringify .ajax ? [Eines der (wenigen) Dinge, die ich am MS AJAX-Framework wirklich mag, ist die clientseitige Proxy-Generierung: Sie macht den Aufruf von Webdiensten und Seitenmethoden wirklich sehr einfach. Allerdings bin auch ich dabei, jQuery gegenüber MS AJAX zu bevorzugen].

Oder alternativ... Ihr Problem ist wirklich, dass die De-Serialisierung der JSON-Daten in die Argumente Ihrer Seitenmethode transparent vom Framework durchgeführt wird (was in den meisten Fällen eine gute Sache ist), aber wenn es schief geht, ist das Feedback, das Sie erhalten, weniger als hilfreich. Wenn Sie De-Serialisierungsprobleme abfangen wollen, müssen Sie die Kontrolle über die Serialisierung übernehmen, indem Sie entweder benutzerdefinierte JSON-Konverter verwenden (siehe aquí ) oder durch die Verwendung des eher uneleganten Ansatzes, bei dem die Methode eine Zeichenkette akzeptiert und die JSN selbst in der Methode de serialisiert wird - was mit einer der zahlreichen JSON-Bibliotheken trivial ist.

0voto

Mauricio Scheffer Punkte 97391

Javascript ist dynamisch typisiert, so dass Sie keinen Kompilierfehler erhalten können. Aber Sie könnten die alte window.onerror + ajax Trick (oder senden Sie den Fehler über Ajax in der error Rückruf von jQuery.ajax() ), und sobald Sie auf dem Server sind, können Sie ihn wie jeden anderen Laufzeitfehler behandeln (eine Ausnahme auslösen, den Fehler protokollieren, was auch immer)

0voto

Xs10tial Punkte 145

Aus der Sicht von jQuery liegt Ihr Problem in der Deklaration der Fehlerfunktion. Nehmen Sie nur einen Eingabeparameter, und das wird alle Eigenschaften des Fehlers haben, dann können Sie leichter debuggen.

Wenn das Problem auf der Serverseite liegt, fangen Sie den Fehler dort ab und erstellen Sie eine Rückgabe-Json-Datei mit der Fehlermeldung.

Oh, und wenn Sie Ihr Javascript bei der Kompilierung überprüfen wollen, empfehle ich das Add-In von jslint.com.

Also:

$.ajax({ type: "POST", url: "MyWebPage.aspx/SaveComplexRecord", data: jsondata, contentType: "application/json; charset=utf-8", dataType: "json", beforeSend: function(xhr) { xhr.setRequestHeader("Content-type", "application/json; charset=utf-8"); }, success: function(msg) { //etwas bei Erfolg tun }, error: function(err) { alert(e.message); } });

0voto

marsbard Punkte 2088

Bei der Rückgabe von JSON aus einem Webdienst habe ich ein Objekt namens "ret", das ein Attribut "err" sowie das Attribut "data" mit dem Ergebnis des Dienstaufrufs enthält. Innerhalb des Webdienstes fange ich alle Ausnahmen ab und lege die Ausnahmemeldung in das Attribut "err". Im Client prüfe ich dann, ob das Attribut "err" nicht leer ist, und wenn ja, weiß ich, dass ein Fehler aufgetreten ist.

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