Domanda

chiedevo quale si pensava di questa soluzione, se questo è il modo giusto per passare un messaggio di errore per una pagina personalizzata?

Nel 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>

Nel mio 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;
    }
}

di problema: io non voglio fare un server.Transfer da Global.asax perché .. non lo so. Sembrava maldestro di me. Vuoi essere in grado di cambiare customErrors a RemoteOnly. Così hanno per salvare ultima eccezione da qualche parte, ma non può essere Session, così risparmiare alla cache, ma con alcuni dati aggiuntivi (tempo e SessionID) dal Cache è globale e vuole fare in modo che non mostra l'errore sbagliato a qualcuno.


Ho cambiato il mio codice in qualche modo. Ora è solo:

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

... e ...

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

Si noti SessionID non c'è se l'utente anonimo e ex.Data.Add una chiave che è già lì causerà errore facendomi capire che è importante chiamare ClearError

È stato utile?

Soluzione

Penso che questo sia un modo decente per farlo. Non è il modo in cui lo faccio, ma il mio codice è troppo lungo per pubblicare (e in VB.NET).

Una cosa che vorrei cambiare è la pagina di errore stesso. Invece di visualizzare l'errore, considerare l'aggiunta di una casella di testo alla pagina di errore come un campo facoltativo in cui l'utente può inserire il proprio indirizzo e-mail e fare clic su un pulsante per inviare la segnalazione dell'errore a voi. Poi, quando si riceve la segnalazione di errore si può guardare il problema e rispondere a loro. E 'un utente modo molto più amichevole per farlo e ha funzionato abbastanza bene per i siti che ho fatto questo su.

Lungo queste linee, si potrebbe anche voler raccogliere i dati dei moduli, dati di sessione, e qualsiasi altra cosa di valore e mettere che nel rapporto di errore pure. Questo può rendere la diagnosi dei problemi molto più facile.

Altri suggerimenti

Facciamo qualcosa che può o non può funzionare per voi. Facciamo vasto annotare nel DB. Quando otteniamo un errore, registriamo e che produce un ID errore. Abbiamo reindirizzamento alla pagina generica con l'ID di errore e ottenere i dettagli qui.

naturalmente questo cade piatto sul suo volto quando l'errore è 'non è in grado di connettersi a DB', ma che non accade troppo spesso;)

Come la cache è globale questo non sarebbe consigliabile, come hai detto si potrebbe visualizzare l'errore sbagliato a qualcuno. Vorrei anche dire che non si dovrebbe uscita il messaggio di errore direttamente agli utenti finali per motivi di sicurezza.

Date un'occhiata a questo problema:

server di pagina di errore personalizzata ASP.NET GetLastError è nullo

Per riassumere mettere qualcosa come il seguente:

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

Piuttosto che fare affidamento su ASP.NET per fare il redirect utilizzando le impostazioni nella sezione CustomErrors.

I sarebbe d'accordo sia con n8wrl e Steve che un approccio migliore sarebbe quello di registrare gli errori nel database e poi tornare solo un ID errore per l'utente. Hanno davvero non hanno bisogno di vedere i dettagli tecnici ed è possibile che questo esporrà le informazioni sensibili.

Nel nostro caso, si passa anche in ID dell'utente (se disponibile) e la pagina in cui si è verificato l'errore (Request.URL è ancora buono quando si arriva alla Application_Error globale). In questo modo, siamo in grado di rintracciare l'errore un po 'più facile. Si noti, inoltre, che non c'è bisogno di utilizzare Global.asax con un tag script. Se si crea un file Global.asax.cs nella directory App_Code, si può solo codice C # direttamente (questo può dipendere dal tipo di progetto, però).

Server.ClearError();

Questa linea deve essere collocato su Error.aspx.cs dopo la visualizzazione ErrorMessage penso.

Sono stato incaricato di creare una pagina di errore personalizzata. Tutto era piuttosto semplice: nel file web.config ho avuto:

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

e in Global.asax, nel metodo Application_Error: po 'di codice ...

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

Nella pagina di errore "error.aspx" personalizzato: Server.ClearError();

Non so esattamente quello che è stato modificato, ma questo non ha funzionato più. Quando il codice raggiunse il metodo Server.Transfer, l'eccezione è stata sollevata da sempre: Errore durante l'esecuzione richiesta figlio per la pagina ...

Ho guardato alcune soluzioni e finalmente trovato questo. Ho modificato il mio codice, e ora sembra funzionare:

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

e nel metodo Global.asax:

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

E 'inoltre lavorato con il Cache [ ""] il codice, ma ho preferito la variabile di sessione.

Quindi, grazie per le risposte.

  • non dimenticare di eliminare l'errore nella pagina di errore personalizzata. Questo è importante. Inoltre, sarebbe stato indicato per non mostrare esattamente tutto l'errore per l'utente. Forse in un formato certo facile da usare. E dare tutte le informazioni in un file di log, o inviarlo via e-mail o altro.

Spero che questo è stato utile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top