Crear páginas de informes de errores personalizadas en ASP.NET mediante Visual Basic .NET

En este artículo se describe cómo usar microsoft Visual Basic código .NET para capturar y responder a errores cuando se producen en ASP.NET.

Versión del producto original:   Visual Basic .NET, ASP.NET
Número KB original:   308132

Resumen

ASP.NET ha mejorado las opciones de control de errores de páginas Active Server (ASP) tradicional. En ASP.NET, puede controlar errores en varios niveles diferentes de las aplicaciones.

Nuevas características en ASP.NET

ASP.NET ofrece varios avances en la forma de controlar y responder a los errores. En ASP tradicional, se controlan errores On Error Resume Next con (o try-catch bloques en JScript). Como alternativa, si está ejecutando Internet Information Services (IIS), se usa el objeto para crear una página de informes ASPError de errores personalizada. Sin embargo, estos enfoques tienen sus limitaciones.

ASP.NET proporciona varios niveles en los que puede controlar y responder a los errores que pueden producirse al ejecutar una ASP.NET aplicación. ASP.NET proporciona tres métodos principales que permiten capturar y responder a errores cuando se producen: el evento, el evento y el archivo de configuración de la aplicación Page_Error Application_Error (Web.config).

En este artículo se muestra cómo usar estas nuevas características en la ASP.NET aplicación. Aunque en este artículo se describe cómo proporcionar páginas de error personalizadas e informes de errores generales en relación directamente con ASP.NET, en este artículo no se describen otros métodos de control de errores, como el bloque y el sistema de excepciones common try-catch-finally language runtime (CLR).

Usar el Page_Error evento

El Page_Error evento proporciona una forma de capturar los errores que se producen en el nivel de página. Puede mostrar información de error (como hace el código de ejemplo a seguir), o puede registrar el evento o realizar alguna otra acción.

Nota

En este ejemplo se muestra información detallada de error en el explorador solo con fines de demostración. Querrá tener cuidado al mostrar información detallada al usuario final de la aplicación, especialmente cuando la aplicación se ejecuta en Internet. Una acción más apropiada sería mostrar un mensaje al usuario notificándolo de que se ha producido un error y, a continuación, registrar los detalles de error específicos en el registro de eventos.

En este ejemplo se produce una excepción nula, que fuerza un error en el Page_Load evento. Siga estos pasos para crear la página inicial que probará el Page_Error evento.

  1. Siga estos pasos para agregar un nuevo archivo denominado PageEvent.aspx al proyecto:

    1. Abra Visual Studio .NET.
    2. En el Explorador de soluciones, haga clic con el botón secundario en el nodo del proyecto, elija Agregar y, a continuación, haga clic en Agregar formulario web.
    3. En el cuadro de texto Nombre, escriba PageEvent.aspx y, a continuación, haga clic en Abrir.
  2. Agregue el siguiente código a PageEvent.aspx:

    <%@ Page Language="vb"%>
    <script runat=server>
        Sub Page_Load(Sender as object, e as EventArgs)
           throw(new System.ArgumentNullException())
        End Sub
        Sub Page_Error(Sender as object, e as EventArgs)
           Dim objErr as Exception = Server.GetLastError().GetBaseException()
           Dim err as String = "<b>Error Caught in Page_Error event</b><hr><br>" & _
                               "<br><b>Error in: </b>" & Request.Url.ToString() & _
                               "<br><b>Error Message: </b>" & objErr.Message.ToString() & _
                               "<br><b>Stack Trace:</b><br>" & _objErr.StackTrace.ToString()
           Response.Write(err.ToString())
           Server.ClearError()
        End Sub
    </script>
    
  3. En el menú Archivo, haga clic en Guardar PageEvent.aspx.

  4. Haga clic con el botón secundario en la página y, a continuación, haga clic en Ver en el explorador para ejecutar la página. Observe que el error se produce e informa de acuerdo con las especificaciones de código.

Nota

Es posible que observe que el código emite una llamada a Server.ClearError . Esto evita que el error continúe en el Application_Error evento que se va a controlar.

Usar el Application_Error evento

De forma similar al evento, puede usar el evento para capturar Page_Error los errores que se producen en la Application_Error aplicación. Debido al ámbito de toda la aplicación del evento, puede registrar la información de error de la aplicación o controlar otros errores de nivel de aplicación que pueden producirse.

El ejemplo que se va a seguir se basa en el ejemplo de código de evento anterior y se desencadena si el error del evento Page_Error no estaba atrapado en el Page_Load Page_Error evento. El Application_Error evento se especifica en el archivo Global.asax de la aplicación. Por motivos de simplicidad, los pasos de esta sección crean una nueva página en la que se inicia la excepción, se captura el error en el caso del archivo Application_Error Global.asax y se escribe el error en el registro de eventos. Los pasos siguientes muestran cómo usar el Application_Error evento:

  1. Agregue un nuevo archivo denominado AppEvent.aspx al proyecto.

  2. Agregue el siguiente código a AppEvent.aspx:

    <script language=vb runat="server">
         Sub Page_Load(Sender as object, e as EventArgs)
             throw(new ArgumentNullException())
         End Sub
    </script>
    
  3. En el menú Archivo, haga clic en Guardar AppEvent.aspx.

  4. Agregue el evento al archivo Global.asax para capturar el error que se produce en el Application_Error evento de la página Page_Load AppEvent.aspx. Tenga en cuenta que debe agregar una Imports instrucción para el espacio de nombres a System.Diagnostics Global.asax para usar el registro de eventos.

    Agregue el siguiente código al archivo Global.asax:

    Imports System.Diagnostics
    Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
        Dim objErr As Exception = Server.GetLastError().GetBaseException()
        Dim err As String = "Error Caught in Application_Error event" & _
                                System.Environment.NewLine & _
                                "Error in: " & Request.Url.ToString() & _
                                System.Environment.NewLine & _
                                "Error Message: " & objErr.Message.ToString() & _
                                System.Environment.NewLine & _
                                "Stack Trace:" & objErr.StackTrace.ToString()
        EventLog.WriteEntry("Sample_WebApp", err, EventLogEntryType.Error)
        Server.ClearError()
        additional actions...
    End Sub
    
  5. Guarde el archivo Global.asax.

  6. En Visual Studio .NET, en el menú Generar, haga clic en Generar.

  7. Haga clic con el botón secundario en la página y, a continuación, haga clic en Ver en el explorador. En este caso, la página estará en blanco, sin embargo, debe observar que se ha agregado una nueva entrada en el registro de eventos. En este ejemplo se realiza una entrada en el registro de aplicaciones, al que se puede acceder desde el Visor de eventos. Después de registrar el error, es posible que desee redirigir al usuario a otra página de error más fácil de usar, o realizar algunas acciones adicionales si es necesario.

Usar el Web.config archivo

Si no llama ni captura el error en el evento or, el error se controla en función de la configuración de la sección del Server.ClearError Page_Error Application_Error <customErrors> Web.config archivo. En la sección, puede especificar una página de redireccionamiento como página de error predeterminada ( ) o especificar a una página determinada en función del código de error del Protocolo de transferencia de hipertexto <customErrors> defaultRedirect (HTTP) que se genera. Puede usar este método para personalizar el mensaje de error que recibe el usuario.

Si se produce un error que no está atrapado en ninguno de los niveles anteriores de la aplicación, se muestra esta página personalizada. En esta sección se muestra cómo modificar el archivo Global.asax para que Server.ClearError nunca se llame. Como resultado, el error se controla en el archivoWeb.config como el último punto para capturar el error.

  1. Abra el archivo Global.asax del ejemplo anterior.

  2. Comenta la línea Server.ClearError para asegurarte de que el error aparece en el Web.config archivo.

  3. Guarde los cambios en Global.asax. El código ahora debería ser similar al siguiente:

     Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
         Dim objErr As Exception = Server.GetLastError().GetBaseException()
         Dim err As String = "Error Caught in Application_Error event" & _
                             System.Environment.NewLine & _
                             "Error in: " & Request.Url.ToString() & _
                             System.Environment.NewLine & _
                             "Error Message: " & objErr.Message.ToString() & _
                             System.Environment.NewLine & _
                             "Stack Trace:" & objErr.StackTrace.ToString()
         EventLog.WriteEntry("Sample_WebApp", err, EventLogEntryType.Error)
         Server.ClearError()
         additional actions...
     End Sub
    
  4. Agregue el siguiente código a la <customErrors> sección para redirigir al usuario a una página personalizada:

    <customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On">
    </customErrors>
    

    Nota

    Debe modificar la ruta de acceso del archivo en el atributo para que haga referencia a los nombres de aplicación y defaultRedirect servidor web relevantes.

  5. Dado que los errores que están atrapados en este nivel se envían a una página de error predeterminada, debe crear una página de error denominada ErrorStatus.htm. Tenga en cuenta que usa este método para controlar lo que se presenta al usuario, por lo que en este ejemplo se usa una página.htmpara la página de error. Agregue el siguiente código a ErrorStatus.htm:

    <HTML>
        <HEAD>
            <TITLE></TITLE>
            <META NAME="GENERATOR" Content="Microsoft Visual Studio 7.0">
        </HEAD>
        <BODY>
             <b>Custom Error page!</b>
             <br>
             You have been redirected here from the <customErrors> section of the
             Web.config file.
        </BODY>
    </HTML>
    
  6. Para probar el código, guarde los archivos, cree el proyecto y, a continuación, vea AppEvent.aspx en el explorador. Tenga en cuenta que cuando se produce el error, se le redirige a la ErrorStatus.htm web. Aunque puede hacer referencia a una página de error predeterminada en el valor del atributo de la sección, también puede especificar una página determinada a la que redirigir en función del código de error HTTP que se defaultRedirect <customErrors> genera. El <error> elemento secundario permite esta opción. Por ejemplo:

    <customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On">
        <error statusCode="404" redirect="filenotfound.htm"/>
    </customErrors>
    

Nota

La página que se especifica en defaultRedirect la sección es un <customErrors> .htm archivo. Si tiene previsto usar en una página .aspx (lo que hacen los ejemplos y), debe almacenar la excepción en una variable de sesión o en algún otro enfoque antes de que se lleve a cabo GetLastError Page_Error el Application_Error redireccionamiento.

Tenga en cuenta <customErrors> que la sección incluye un atributo establecido en mode On . El mode atributo se usa para controlar cómo se produce la redirección de errores. Por ejemplo, si está desarrollando la aplicación, lo más probable es que desee ver los mensajes de error de ASP.NET reales y no desea que se le redirija a la página de error más fácil de usar. El mode atributo incluye la siguiente configuración:

  • On: Las excepciones no controladas redirigen al usuario a la página defaultRedirect especificada. Esto mode se usa principalmente en producción.

  • Off: los usuarios reciben la información de excepción y no se redirigen a la defaultRedirect página. Esto mode se usa principalmente en el desarrollo.

  • RemoteOnly: Solo los usuarios que tienen acceso al sitio en el equipo local (mediante localhost) reciben la información de excepción. Todos los demás usuarios se redirigen a la defaultRedirect página. Este modo se usa principalmente para la depuración.

Solución de problemas

En su instalación predeterminada en Windows, ASP.NET código de aplicación web en un proceso de trabajo. La identidad de este proceso es predeterminada en una cuenta local no privada denominada cuenta ASPNET. En las versiones beta de ASP.NET, la identidad del proceso era System, una cuenta administrativa eficaz con muchos privilegios en el equipo.

En su instalación predeterminada en Windows Server (IIS), ASP.NET código de aplicación web en un proceso de trabajo. La identidad de este proceso es predeterminada en una cuenta limitada denominada NetworkService.

Para obtener más información sobre este cambio y cómo puede tener efecto en la ejecución del código de este artículo, así como otros códigos que podrían necesitar derechos de acceso adicionales, vea patterns & practices

Referencias