Cómo crear un error personalizado reporting páginas en ASP.NET mediante Visual C#.

Para una versión de Microsoft Visual Basic .NET de este artículo, consulte
308132 .

Este artículo hace referencia al siguiente espacio de nombres de biblioteca de clases de Microsoft.NET Framework:
  • System.Diagnostics

EN ESTA TAREA

Resumen

Este artículo describe cómo utilizar código de Visual C# .NET para capturar y responder a los errores cuando se producen en ASP.NET. ASP.NET ha mejorado las opciones de Microsoft páginas Active Server (ASP) tradicionales de tratamiento de errores. En ASP.NET, puede controlar los errores en niveles diferentes en sus aplicaciones.

Volver al principio

Nuevas características de ASP.NET

ASP.NET ofrece varios avances en cómo puede controlar y responder a los errores. En las páginas ASP tradicionales, errores se tratan con "On Error Resume Next" (o bloques try-catch en JScript). Como alternativa, si está ejecutando Microsoft Internet Information Services (IIS) 5.0, utilizar el objeto ASPError para crear una página de informe de error personalizado. 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 aplicación ASP.NET. ASP.NET proporciona tres métodos principales que le permiten capturar y responder a los errores cuando se producen: Page_Error Application_Errory el archivo de configuración de la aplicación (Web.config).

En este artículo se muestra cómo utilizar estas nuevas características en la aplicación ASP.NET. Aunque este artículo describe cómo proporcionar páginas de error personalizadas e informes de error general se relaciona directamente con ASP.NET, este artículo no describe otros enfoques, como el bloque try-catch-finally y el sistema de excepciones Common Language Runtime (CLR) de control de errores.

Volver al principio

Cómo usar el método Page_Error

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

Nota: En este ejemplo se muestra información de error detallada en el explorador únicamente con fines de demostración. Desea 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 que les notifica que se ha producido un error y registrar los detalles de error específico en el registro de sucesos.

En este ejemplo se inicia una excepción nula, que fuerza un error que se produzca en el controlador de eventos Page_Load . Siga estos pasos para crear la página inicial que demostrará el uso del controlador del evento Page_Error .
  1. Siga estos pasos para agregar un nuevo archivo denominado PageEvent.aspx al proyecto:
    1. Abra Microsoft Visual Studio. NET.
    2. En el Explorador de soluciones, haga clic 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.aspxy, a continuación, haga clic en Abrir.
  2. Agregue el código siguiente a PageEvent.aspx:
    <script language=C# runat="server">void Page_Load(object sender, System.EventArgs e)
    {
    throw(new ArgumentNullException());
    }

    public void Page_Error(object sender,EventArgs e)
    {
    Exception objErr = Server.GetLastError().GetBaseException();
    string err ="<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();
    }
    </script>


    Nota: En este ejemplo de código, el atributo AutoEventWireup no se establece explícitamente. Si no asigna explícitamente un valor para el atributo AutoEventWireup , se utiliza el valor predeterminado es true . Si está utilizando Visual Studio .NET para desarrollar sus aplicaciones, el código de la plantilla de formulario Web Forms establece explícitamente el valor del atributo AutoEventWireup a false. Hay una diferencia importante entre el valor predeterminado que usa ASP.NET y el valor predeterminado que el código de la plantilla de Visual Studio .NET asigna a este atributo. Si el valor del atributo AutoEventWireup se establece en false, los controladores de eventos se declaran en el. Página ASPX no se activan. Esto puede resultar confuso si no conoce esta funcionalidad.
  3. En el menú archivo , haga clic en Guardar PageEvent.aspx.
  4. Haga clic derecho en la página y, a continuación, haga clic en Ver en el explorador para ejecutar la página. Observe que el error produce y se notifica según las especificaciones del código.
Nota: Puede observar que el código emite una llamada a Server.ClearError. Esto impide que el error continúe al controlador de eventos Application_Error .

Además, también debe tomar nota del atributo Inherits en la directiva @ Page . Si se establece Inherits , deberá generar el proyecto antes de explorar la página. Si no genera el proyecto primero, recibirá el siguiente mensaje de error:
'Project.PageEvent' no es un tipo válido
Volver al principio

Cómo usar el método Application_Error

Similar al controlador del evento Page_Error , puede utilizar el controlador del evento Application_Error para capturar los errores que se producen en su aplicación. Debido al alcance de toda la aplicación del evento, puede registrar la información de error de aplicación de o tratar otros errores de aplicación que pueden producirse.

El ejemplo siguiente se basa en el ejemplo de código Page_Error anterior y se desencadenaría si el error de Page_Load no se capturó en el controlador del evento Page_Error . El controlador del evento Application_Error se especifica en el archivo Global.asax de la aplicación. Por simplicidad, los pasos de esta sección crean una nueva página en la que se va a producir la excepción, captura el error en el controlador del evento Application_Error del archivo Global.asax y escribir el error en el registro de sucesos. Los pasos siguientes muestran cómo usar el método Application_Error :
  1. Agregar un nuevo archivo llamado AppEvent.aspx al proyecto.
  2. Agregue el código siguiente a AppEvent.aspx:
    <script language=C# runat="server">void Page_Load(object sender, System.EventArgs e)
    {
    throw(new ArgumentNullException());
    }
    </script>


    Nota: La información descrita en la sección "Page_Error" sobre el atributo AutoEventWireup también se aplica a la muestra de código en este paso. Consulte la información en la sección "Page_Error" para obtener más detalles.
  3. En el menú archivo , haga clic en Guardar AppEvent.aspx.
  4. Agregue el controlador del evento Application_Error al archivo Global.asax para capturar el error que inició en el controlador de eventos Page_Load de la página AppEvent.aspx. Observe que debe agregar otra instrucción using para el espacio de nombres System.Diagnostics al archivo Global.asax para usar el registro de sucesos.

    Agregue el código siguiente al archivo Global.asax:
    using System.Diagnostics;
    protected void Application_Error(object sender, EventArgs e)
    {
    Exception objErr = Server.GetLastError().GetBaseException();
    string err ="Error Caught in Application_Error event\n" +
    "Error in: " + Request.Url.ToString() +
    "\nError Message:" + objErr.Message.ToString()+
    "\nStack Trace:" + objErr.StackTrace.ToString();
    EventLog.WriteEntry("Sample_WebApp",err,EventLogEntryType.Error);
    Server.ClearError();
    //additional actions...
    }

  5. Guarde el archivo Global.asax.
  6. En Visual Studio. NET, en el menú Generar , haga clic en Generar.
  7. Haga clic derecho 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 tener en cuenta que se ha agregado una nueva entrada en el registro de sucesos. En este ejemplo se crea una entrada en el registro de aplicación, que está accesible desde el Visor de sucesos. Después de registrar el error desee redirigir al usuario a otra página de errores más sencilla o realizar algunas acciones adicionales si es necesario.
Volver al principio

Cómo utilizar el archivo Web.config

Si no llama a Server.ClearError o captura el error en el Page_Error o Application_Error controlador de eventos, el error se controla según la configuración en la sección < customErrors > del archivo Web.config. En la sección < customErrors >, puede especificar una página de redirección como página de errores predeterminada (defaultRedirect) o especificar una página determinada basada en el código de error HTTP que se produce. Puede utilizar este método para personalizar el mensaje de error que recibe el usuario.

Si se produce un error que no se captura en ninguno de los niveles anteriores de la aplicación, se muestra esta página personalizada. Esta sección muestra cómo modificar el archivo Global.asax para que nunca se llame a Server.ClearError . Como resultado, el error se controla en el archivo Web.config como el último punto para capturar el error.
  1. Abra el archivo Global.asax del ejemplo anterior.
  2. Comente la línea Server.ClearError para asegurarse de que las superficies de error en el archivo Web.config.
  3. Guardar los cambios en Global.asax. El código debería parecerse ahora al siguiente:
    using System.Diagnostics;
    protected void Application_Error(object sender, EventArgs e)
    {
    Exception objErr = Server.GetLastError().GetBaseException();
    string err ="Error Caught in Application_Error event\n" +
    "Error in: " + Request.Url.ToString() +
    "\nError Message:" + objErr.Message.ToString() +
    "\nStack Trace:" + objErr.StackTrace.ToString();
    EventLog.WriteEntry("Sample_WebApp",err,EventLogEntryType.Error);
    //Server.ClearError();
    //additional actions...
    }

  4. Agregue el código siguiente a la sección < customErrors > para redirigir al usuario a una página personalizada:
    <customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On"></customErrors>

    Nota: Debe modificar la ruta del archivo en el atributo defaultRedirect para que haga referencia a los nombres de servidor y la aplicación Web correspondientes.
  5. Como los errores que se capturan en este nivel se envían a una página de error predeterminada, debe crear una página de error llamada ErrorStatus.htm. Tenga en cuenta que se utilice este método para controlar lo que se presenta al usuario, por lo que este ejemplo usa una página .htm para la página de error. Agregue el código siguiente al archivo 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, genere el proyecto y, a continuación, vea el archivo AppEvent.aspx en el explorador. Observe que cuando se produce el error, se le redirige a la página ErrorStatus.htm.
Aunque puede hacer referencia a una página de error predeterminada en el valor del atributo defaultRedirect de la sección < customErrors >, también puede especificar una página concreta a redirigir basándose en el código de error HTTP que se produce. El elemento secundario < error > admite 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 de la sección < customErrors > es un archivo .htm. I

Observe que la sección < customErrors > incluye un atributo de modo está establecido en On. El atributo mode se utiliza para controlar cómo se produce la redirección del error. Por ejemplo, si está desarrollando la aplicación, usted probablemente desee ver los mensajes de error ASP.NET reales y no desea que se redirige a la página de errores más sencilla. El atributo mode incluye las siguientes opciones:
  • En: las excepciones no controladas redirigen al usuario a la página especificada defaultRedirect . Este modo se usa principalmente en producción.
  • Desactivado: los usuarios reciben la información de excepción y no se redirige a la página defaultRedirect . Este modo se usa principalmente en desarrollo.
  • RemoteOnly: sólo los usuarios que tienen acceso al sitio del equipo local (mediante localhost) reciben la información de excepción. Todos los demás usuarios se redirigen a la página defaultRedirect . Este modo se usa principalmente para depuración.
Volver al principio

Solución de problemas

En su instalación predeterminada en Microsoft Windows 2000 y en Microsoft Windows XP, ASP.NET ejecuta el código de aplicación Web en un proceso de trabajo. La identidad de este proceso de forma predeterminada a una cuenta local sin privilegios denominada ASPNET. En las versiones beta de ASP.NET, la identidad del proceso era sistema, una eficaz cuenta administrativa con muchos privilegios en el equipo.


En su instalación predeterminada en Windows Server 2003 (IIS 6), ASP.NET ejecuta el código de aplicación Web en un proceso de trabajo. La identidad de este proceso de forma predeterminada a una cuenta local limitada denominada NetworkService.

Para obtener más información acerca de este cambio y cómo puede afectar a la ejecución del código de este artículo y otro código que podría necesitar derechos de acceso adicionales, visite los siguientes sitios Web:
Cambios de seguridad en la versión 1 de la de Microsoft.NET Framework
http://msdn2.microsoft.com/en-us/library/ms994923.aspx
Volver al principio
Propiedades

Id. de artículo: 306355 - Última revisión: 22 ene. 2017 - Revisión: 1

Comentarios