3 Stimmen

Ajax-Formular-Post ergibt einen 500 Internal Server Error

Primäre Frage

Ich habe ein einziges Formular, das je nach verschiedenen zugrunde liegenden Metadaten verschiedene Variationen eines Formulars anzeigt. In einem speziellen Fall, nur in der bereitgestellten Anwendung (funktioniert einwandfrei in den Dev- und QA-Umgebungen), führt eine Variante des Formulars zu einem 500 Internal Server Error. Ich habe die an den Server zurückgesendeten Daten in den Dev- und Live-Umgebungen untersucht, und es gibt überhaupt keinen Unterschied.

Die Frage ist, wie kann ich diesen 500-Fehler finden? Ich habe elmah installiert, und es wird nicht ausgelöst. Ich habe ein Logging-Statement als ersten Schritt in meinem POST-Handler gesetzt, und es wird nie ausgeführt. Ich habe in meiner web.config gesetzt, und es zeigt mir keine bessere Fehlermeldung. Das einzige, woran ich denken kann, ist, dass es sich um ein Routing-Problem handelt, aber das fühlt sich nicht wirklich richtig an, da dieselben Daten problemlos geroutet werden, um für andere Server zu funktionieren.

Also, was kann ich noch tun, um diesen schwer fassbaren Fehler zu finden?

Hintergrundinformationen

Ich habe ein Berichtsmodul in der App, die ich baue, und es wird von Metadaten gesteuert. Sobald sie auswählen, welchen Bericht sie ausführen möchten, ruft die Software die Metadaten für den Bericht ab, ermittelt, welche Parameter gesammelt werden müssen, und zeigt ein Formular an, um sie vom Benutzer einzusammeln. Sobald der Benutzer das Formular ausgefüllt hat, klickt er auf eine Schaltfläche, die das Formular über einen jquery $.ajax() Aufruf sendet. Der Controller sollte den eingehenden Formularbeitrag aufnehmen, die Formulardaten validieren und entweder das Formular erneut anzeigen oder ein JSON mit einer URL zurückgeben, um die Berichtsrendervorgang anzuzeigen.

Routen Konfiguration

public class RouteConfig {
    public static void RegisterRoutes(RouteCollection routes) {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
             name: "Default",
             url: "{controller}/{action}/{id}",
             defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

Ajax-Postcode

var ajaxUrl = this.action;
var ajaxType = this.method;
var ajaxData = $(this).serialize();
$.ajax({
    url: ajaxUrl,
    type: ajaxType,
    data: ajaxData,
    success:
        function(result) {
            // kam ein JSON vom Server zurück?
            if (typeof(result) === "object") { // Umgang mit dem Rückgabewert...
                if (window.console) console.log("-- Berichtsparam Formularübermittlung bestanden die Validierung");
                $("#popupDialog").popup("close");
                // benötigen eine Nicht-AJAX-Version, um zur URL zu gelangen, so dass wir eine DOM-Aktualisierung erhalten - wir möchten auch eine neue Seite
                // window.location.href =
                window.open(result.URL, '_blank');
            } else {
                if (window.console) console.log("-- Berichtsparam Formular übermittlung fehlgeschlagen die Validierung");
                $('#popupDialog').html(result);
                $('#popupDialog').trigger('create');
                var _RPT = RevTrak.Portal.Report;
                _RPT.Index.initBindings();
            }
        },

    complete: function() {

        if (window.console) console.log("-- paramEdit Formularübermittlung AJAX-Aufruf abgeschlossen"); // das zeigt an, dass wir die Validierung bestanden haben
    },
    error: function(xhr, textStatus, errorThrown) {
        var sErrMsg = "";
        sErrMsg += "paramEdit Formularübermittlung Fehler ";
        sErrMsg += "\n\n" + " - textStatus :" + textStatus;
        sErrMsg += "\n\n" + " - Fehlerstatus :" + xhr.status;
        sErrMsg += "\n\n" + " - Fehlerart :" + errorThrown;
        sErrMsg += "\n\n" + " - Fehlermeldung :" + xhr.responseText;

        if (window.console) console.log(sErrMsg)
        alert(sErrMsg);
    }
});

Vielen Dank!

2voto

reidLinden Punkte 3790

In diesem Fall lautete die Antwort, die App auf dem Live-Webserver auszuführen.

Nachdem ich das getan hatte, konnte ich weitere Details zum Fehler sehen. Ich hatte erwartet, dass das Setzen von in der web.config dasselbe bewirken würde, aber offensichtlich lag ich damit falsch.

Wie dem auch sei, nachdem ich einen Browser vom Webserver selbst aus ausgeführt hatte, konnte ich sehen, dass der Fehler Ein potenziell gefährlicher Request.Form-Wert wurde vom Client erkannt (repModel.sQuery="...UND THEDATE<DATEADD(dd,1,@dtEnd..."). war, und das reicht mir an Informationen, um herauszufinden, wohin ich als Nächstes gehen soll.

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