Frage

Frage mich, was Sie von dieser Lösung dachte, wenn dies der richtige Weg ist, eine Fehlermeldung zu einer benutzerdefinierten Seite passieren?

In web.config:

    <customErrors mode="On" defaultRedirect="~/Error.aspx"></customErrors>

In Global.asax:

<script RunAt="server">
    void Application_Error(object sender, EventArgs e)
    {
    Exception ex = Server.GetLastError();
    if (ex != null && Session != null)
    {
        ex.Data.Add("ErrorTime", DateTime.Now);
        ex.Data.Add("ErrorSession", Session.SessionID);
        HttpContext.Current.Cache["LastError"] = ex;
    }
    }

</script>

In meinem Error.aspx.cs:

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack) return;

    if (HttpContext.Current.Cache["LastError"] != null)
    {
        Exception ex = (Exception)HttpContext.Current.Cache["LastError"];
        if (ex.Data["ErrorTime"] != null && ex.Data["ErrorSession"] != null)
            if ((DateTime)ex.Data["ErrorTime"] > DateTime.Now.AddSeconds(-30d) && ex.Data["ErrorSession"].ToString() == Session.SessionID)
                Label1.Text = ex.InnerException.Message;
    }
}

Frage: Ich möchte nicht einen Server.Transfer von Global.asax zu tun, weil .. ich weiß nicht. Schien ungeschickt zu mir. Will in der Lage sein zu Customremoteonly zu ändern. So letzte Ausnahme irgendwo speichern müssen, kann aber Session nicht sein, so speichern, um Cache aber mit einigen zusätzlichen Daten (Zeit und SessionID) seit Cache ist global und wollen sicherstellen, dass nicht falsch Fehler zeigt an jemanden.


änderte ich meinen Code etwas. Jetzt ist es nur:

void Application_Error(object sender, EventArgs e)
{
    HttpContext.Current.Cache["LastError"] = Server.GetLastError().GetBaseException();
    Server.ClearError();
}

... und ...

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack) return;

    if (HttpContext.Current.Cache["LastError"] != null)
    {
        Exception ex = (Exception)HttpContext.Current.Cache["LastError"];
        if (ex != null)
            Label1.Text = ex.Message;
    }
}

Hinweis SessionID nicht dort, wenn anonyme Benutzer und ex.Data.Add einen Schlüssel, der bereits vorhanden ist verursachen Fehler machen mir klar, es ist wichtig, Clear zu nennen

War es hilfreich?

Lösung

Ich denke, das ist ein anständiger Weg, es zu tun. Es ist nicht so, wie ich es tun, aber mein Code ist zu lang zu schreiben (und in VB.NET).

Eine Sache, die ich ändern würde, ist die Fehlerseite selbst. Anstatt die Fehler anzuzeigen, sollten Sie auf die Fehlerseite als optionales Feld ein Textfeld hinzugefügt werden, wobei der Benutzer die E-Mail-Adresse eingeben und auf eine Schaltfläche klicken Sie den Fehlerbericht an Sie zu senden. Dann, wenn Sie den Fehlerbericht erhalten, können Sie auf dem Problem suchen und sie antworten. Es ist eine viel benutzerfreundlicher Art und Weise, es zu tun, und es ist sehr gut für die Standorte erarbeitet ich dies auf getan habe.

In diese Richtung wollen Sie vielleicht auch als auch Formulardaten, Sitzungsdaten, und alles, was von Wert und setzen, dass in den Fehlerbericht zu sammeln. Dies kann zu Problemen viel einfacher zu diagnostizieren.

Andere Tipps

Wir tun etwas, das nicht für Sie arbeiten oder nicht. Wir machen die umfangreiche Protokollierung in der DB. Wenn wir einen Fehler, melden wir es und erzeugt eine ID-Fehler. Wir Umleitung auf die generische Seite mit der Fehlerkennung und erhalten die Details gibt.

natürlich diese auf seinem Gesicht flach fallen, wenn der Fehler ‚kann DB nicht‘, aber das passiert nicht allzu oft;)

Als Cache global ist, wäre dies nicht sinnvoll sein, wie Sie gesagt haben könnten Sie den falschen Fehler zu jemandem werden angezeigt wird. Ich möchte auch sagen, dass Sie die Fehlermeldung nicht ausgegeben sollte direkt Benutzer aus Sicherheitsgründen beenden.

Haben Sie einen Blick auf dieses Problem:

ASP.NET benutzerdefinierte Fehlerseite Server GetLastError ist null

put etwas wie die folgende Zusammenfassung:

Server.Transfer(String.Concat("~/Error.aspx?message=", HttpUtility.UrlEncode(ex.InnerException.Message)))

Anstatt sich auf ASP.NET verlassen, um die Umleitung über die Einstellungen im Abschnitt Custom zu tun.

hätte ich mit beiden n8wrl und Steve vereinbaren, dass ein besserer Ansatz Fehler in der Datenbank anmelden würde und dann den Benutzer nur einen Fehler-ID zurück. Sie müssen wirklich nicht über die technischen Details zu sehen und es ist möglich, dass diese sensiblen Informationen aussetzen wird.

In unserem Fall geben wir auch in der Benutzer-ID (falls vorhanden) und der Seite, wo der Fehler aufgetreten ist (Request.URL ist immer noch gut, wenn Sie auf die globale Application_Error bekommen). Auf diese Weise können wir den Fehler ein bisschen leichter aufzuspüren. Beachten Sie auch, dass Sie nicht Global.asax mit einem Script-Tag zu verwenden. Wenn Sie eine Global.asax.cs Datei in Ihrem Verzeichnis App_Code erstellen, können Sie nur direkt Ihre C # -Code (dies vom Projekttyp abhängen kann, obwohl).

Server.ClearError();

Diese Zeile sollte auf Error.aspx.cs platziert werden, nachdem die Anzeige Errormessage, denke ich.

Ich war für eine benutzerdefinierte Fehlerseite zu schaffen. Alles war recht einfach: in der Datei web.config ich hatte:

<customErrors mode="On">
<error statusCode="404" redirect="~/error-pages/page-not-found.aspx?error=1"
</customErrors>

und in Global.asax, in der Application_Error Methode: einige Code ...

Server.Transfer("~/error-pages/error.aspx");

In der benutzerdefinierten Fehlerseite "error.aspx": Server.ClearError();

Ich weiß nicht genau, was geändert wurde, aber dies mehr nicht funktionierte. Wenn der Code die Methode Server.Transfer erreicht hatte, wurde eine Ausnahme immer angehoben: Fehler Kind Anforderung für die Seite Ausführen ...

ich bei einigen Lösungen gesucht und fand schließlich diesen. Ich änderte meinen Code, und jetzt scheint es zu funktionieren:

<customErrors mode="On" defaultRedirect="~/error-pages/error.aspx">
  <error statusCode="404" redirect="~/error-pages/page-not-found.aspx?error=1" />
</customErrors>

und in der global.asax Methode:

Session["LastError"] = Server.GetLastError();

Es funktionierte auch mit dem Cache [ ""] Code, aber ich lieber die Session-Variablen.

So, vielen Dank für die Antworten.

  • vergessen Sie nicht, den Fehler in der benutzerdefinierten Fehlerseite zu löschen. Das ist wichtig. Auch wäre es angezeigt werden, um nicht genau zu zeigen alle die Fehler an den Benutzer. Vielleicht in einem bestimmten benutzerfreundlichen Format. Und geben Sie alle Informationen in einer Protokolldatei, oder es sonst per E-Mail oder etwas senden.

Hoffe, das war sehr nützlich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top