Pregunta

Se preguntaba lo que pensaba de esta solución, si se trata de manera correcta para pasar un mensaje de error a una página personalizada?

En web.config:

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

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

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

Por tema: Yo no quiero hacer un Server.Transfer de Global.asax porque .. no sé. Parecía torpe de mí. ¿Quieres ser capaz de cambiar a customErrors RemoteOnly. También lo han hecho para salvar la última excepción de alguna parte, pero no puede ser la sesión, así que guarda en la memoria caché, pero con algunos datos adicionales (tiempo y SessionID) desde caché es global y quiere asegurarse de no mostrar error incorrecto a alguien.


He cambiado mi código un poco. Ahora sólo:

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

... y ...

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

Nota SessionID no existe si el usuario anónimo y ex.Data.Add una clave que ya existe causará haciendo de error que me doy cuenta que es importante llamar ClearError

¿Fue útil?

Solución

Creo que es una buena manera de hacerlo. No es la forma en que lo hago, pero mi código es demasiado largo para publicar (y en VB.NET).

Una cosa que cambiaría es la página de error en sí. En lugar de mostrar el error, considerar la adición de un cuadro de texto a la página de error como un campo opcional donde el usuario puede introducir su dirección de correo electrónico y haga clic en un botón para enviar el informe de errores a ti. Luego, cuando se recibe el informe de errores se puede ver en el problema y responder a ellos. Es una manera mucho más amigable de usuario para hacerlo y ha funcionado bastante bien para los sitios que he hecho esto.

A lo largo de esas líneas, es posible que también desee recopilar datos de formularios, datos de la sesión, y cualquier otra cosa de valor y colocarla en el informe de errores también. Esto puede hacer el diagnóstico de problemas mucho más fácil.

Otros consejos

Lo hacemos algo que puede o no puede trabajar para usted. Hacemos un amplio registro en la base de datos. Cuando conseguimos un error, registramos ella, y produce un ID de error. Redirigimos a la página genérica con el ID de error y obtener los detalles allí.

Por supuesto, esto se cae de bruces cuando el error es 'no puede conectarse a DB', pero eso no sucede muy a menudo;)

Como caché es global esto no sería aconsejable, como usted ha dicho que podría estar mostrando el error equivocado para alguien. También debo decir que debe emitir el mensaje de error directamente a los usuarios finales por razones de seguridad.

Tener un vistazo a este tema:

ASP.NET servidor de páginas de error personalizado GetLastError es nulo

Para resumir algo puesto como el siguiente:

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

En lugar de depender de ASP.NET para hacer la redirección utilizando la configuración en la sección CustomErrors.

Me habría de acuerdo tanto con n8wrl y Steve que un mejor enfoque sería la de registrar los errores en la base de datos y luego regresar sólo un ID de error al usuario. Realmente no es necesario para ver los detalles técnicos y es posible que esto va a exponer información sensible.

En nuestro caso, también pasamos en el ID del usuario (si está disponible) y la página donde se produjo el error (Request.URL sigue siendo bueno cuando se llega a la Application_Error global). De esta manera, podemos rastrear el error un poco más fácil. Tenga en cuenta también que no tiene que utilizar Global.asax con una etiqueta de script. Si crea un archivo Global.asax.cs en su directorio App_Code, sólo puede codificar su C # directamente (esto puede depender del tipo de proyecto, sin embargo).

Server.ClearError();

Esta línea se debe colocar en Error.aspx.cs después de mostrar ErrorMessage creo.

Yo estaba a cargo de la creación de una página personalizada de error. Todo era bastante simple: en el archivo web.config que tenía:

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

y en Global.asax, en el método Application_Error: algo de código ...

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

En la página de error "error.aspx" costumbre: Server.ClearError();

No sé exactamente lo que se modificó, pero esto no funcionó más. Cuando el código alcanzó el método Server.Transfer, una excepción siempre se planteó: Error al ejecutar solicitud secundaria para la página ...

La miré algunas soluciones y finalmente encontré éste. He modificado mi código, y ahora parece que funciona:

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

y en el método Global.asax:

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

También trabajó con el caché [ ""] código, pero yo prefería la variable de sesión.

Así que, gracias por las respuestas.

  • No se olvide de borrar el error en la página de error personalizada. Esto es importante. Además, se indicó que no muestra exactamente todo el error al usuario. Tal vez en un formato amigable determinado usuario. Y dar toda la información en un archivo de registro, o enviarlo por correo electrónico o alguna otra cosa.

Espero que esto era útil.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top