3 Stimmen

Ajax Formular Post ergibt 500 Interner Serverfehler

Primäre Frage

Ich habe ein einziges Formular, das je nach verschiedenen zugrunde liegenden Metadaten unterschiedliche Variationen eines Formulars anzeigen wird. In einem einzigen Fall, nur in der bereitgestellten Anwendung (funktioniert einwandfrei in Entwicklungs- und Testumgebungen), führt eine Variante des Formulars zu einem 500 Internal Server Error. Ich habe die an den Server zurückgesendeten Daten sowohl in den Entwicklungs- als auch in den Live-Umgebungen überprüft, und es gibt überhaupt keinen Unterschied.

Die Frage ist, wie kann ich diesen 500-Fehler zurückverfolgen? Ich habe elmah installiert, und es wird nicht ausgelöst. Ich habe ein Logging-Statement als erste Aktion 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, was mir einfällt, ist, dass ich möglicherweise ein Routing-Problem habe, aber das fühlt sich nicht richtig an, da dieselben Daten problemlos geroutet werden, um für andere Server zu arbeiten.

Also, was kann ich noch tun, um diesen schwer fassbaren Bug zu verfolgen?

Hintergrundinformationen

Ich habe ein Berichtsmodul in der App, die ich baue, und es ist metadatengesteuert. 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 diese vom Benutzer zu sammeln. 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 erfassen, die Formulardaten validieren und dann entweder das Formular erneut anzeigen oder ein JSON mit einer URL zurückgeben, um die Aktion des Berichtsrenderers anzuzeigen.

Routenkonfiguration

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-Post-Code

var ajaxUrl = this.action;
var ajaxType = this.method;
var ajaxData = $(this).serialize();
$.ajax({
    url: ajaxUrl,
    type: ajaxType,
    data: ajaxData,
    success:
        function(result) {
            // did we get a JSON back from the server?
            if (typeof(result) === "object") { //deal with the return result...   
                if (window.console) console.log("-- reportParam form submit passed validation");
                $("#popupDialog").popup("close");
                //need non-ajax version to go to url so we get a dom refresh - we want a new page also
                // window.location.href =
                window.open(result.URL, '_blank');
            } else {
                if (window.console) console.log("-- reportParam form failed validation");
                $('#popupDialog').html(result);
                $('#popupDialog').trigger('create');
                var _RPT = RevTrak.Portal.Report;
                _RPT.Index.initBindings();
            }
        },

    complete: function() {

        if (window.console) console.log("-- paramEdit form submit ajax call complete"); //this indicates we passed validation
    },
    error: function(xhr, textStatus, errorThrown) {
        var sErrMsg = "";
        sErrMsg += "paramEdit form submit error ";
        sErrMsg += "\n\n" + " - textStatus :" + textStatus;
        sErrMsg += "\n\n" + " - Error Status :" + xhr.status;
        sErrMsg += "\n\n" + " - Error type :" + errorThrown;
        sErrMsg += "\n\n" + " - Error message :" + xhr.responseText;

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

Danke!

2voto

reidLinden Punkte 3790

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

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

Wie dem auch sei, nachdem ich einen Browser direkt vom Webserver aus gestartet 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 ist genug Information für mich, um zu wissen, wo es als nächstes hingeht.

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