Excepciones no controladas provocan que las aplicaciones basadas en ASP.NET se cierren inesperadamente en .NET Framework 2.0

Seleccione idioma Seleccione idioma
Id. de artículo: 911816 - Ver los productos a los que se aplica este artículo
Nota: en este artículo se aplica a la de Microsoft.NET Framework 2.0 y versiones posteriores de todo.
Expandir todo | Contraer todo

En esta página

Síntomas

Cuando se produce una excepción no controlada en una aplicación basada en Microsoft ASP.NET que se ha creado en Microsoft .NET Framework 2.0 o una versión posterior, la aplicación se cierra inesperadamente. Cuando este problema tiene lugar, no se registra información alguna de la excepción en el registro de aplicaciones, información que debe tener para comprender el problema.

Sin embargo, se puede registrar un mensaje de eventos similar al siguiente en el registro del sistema:

Tipo de evento: Advertencia
Origen del evento: W3SVC
Categoría del evento: None
Identificador de evento: 1009
Fecha: 9/28/2005
Hora: 3:18:11
Usuario PM: No disponible
Equipo: SERVIDOR IIS
Descripción:
un proceso que atiende el grupo de aplicaciones 'DefaultAppPool' terminó inesperadamente. El Id. de proceso es '2548'. El código de salida de proceso es '0xe0434f4d'.

Además, se puede registrar un mensaje de eventos similar al siguiente en el registro de aplicaciones:

Tipo de evento: Error
Origen del evento: informe de errores de NET Runtime 2.0
Categoría del evento: None
Identificador de evento: 5000
Fecha: 9/28/2005
Hora: 3:18:02 p.m.
Usuario: No disponible
Equipo: SERVIDOR IIS
Descripción:
EventType clr20r3, P1 w3wp.exe, P2 6.0.3790.1830, P3 42435be1, P4 app_web_7437ep-9, P5 0.0.0.0, P6 433b1670, P7 9, P8 a, P9 system.exception, P10 NIL.

Causa

Este problema se produce porque ha cambiado la directiva predeterminada de las excepciones no controladas en .NET Framework 2.0 y en versiones posteriores. De forma predeterminada, la directiva de las excepciones no controladas es finalizar el proceso de trabajo.

En Microsoft .NET Framework 1.1 y Microsoft .NET Framework 1.0, las excepciones no controladas de los subprocesos administrados se ignoraban. A menos que adjuntara un depurador para capturar la excepción, no se daría cuenta de que algo pasa.

ASP.NET utiliza la directiva predeterminada de excepciones no controladas en .NET Framework 2.0 y versiones posteriores. Cuando se produce una excepción no controlada, la aplicación basada en ASP.NET se cierra de forma inesperada.

Este comportamiento no se aplica a las excepciones que se producen en el contexto de una solicitud. Estos tipos de excepciones aún se controlan y ajustan mediante un objeto HttpException. Las excepciones que se producen en el contexto de una solicitud no provocan que finalice el proceso de trabajo. Sin embargo, las excepciones no controladas fuera del contexto de una solicitud, como las que se producen en un subproceso de temporizador o en una función de devolución de llamada, provocan que el proceso de trabajo finalice.

Solución

Para resolver este problema, utilice uno de los métodos siguientes.

Método 1

Modificar el código fuente del objeto IHttpModule para que se registre información de la excepción en el registro de aplicaciones. La información que se registra incluye la siguiente:
  • La ruta de acceso al directorio virtual en el que se produjo la excepción
  • El nombre de la excepción
  • El mensaje
  • El seguimiento de la pila
Para modificar el objeto IHttpModule, siga estos pasos:

Nota: este código registrará un mensaje con el tipo de evento de Error y el origen de evento de ASP.NET 2.0.50727.0 en el registro de aplicaciones. Para probar el módulo, solicite una página ASP.NET que utilice el método ThreadPool.QueueUserWorkItem para llamar a un método que produzca una excepción no controlada.
  1. Coloque el siguiente código en un archivo denominado UnhandledExceptionModule.cs.
    using System;
    using System.Diagnostics;
    using System.Globalization;
    using System.IO;
    using System.Runtime.InteropServices;
    using System.Text;
    using System.Threading;
    using System.Web;
     
    namespace WebMonitor {
        public class UnhandledExceptionModule: IHttpModule {
    
            static int _unhandledExceptionCount = 0;
    
            static string _sourceName = null;
            static object _initLock = new object();
            static bool _initialized = false;
    
            public void Init(HttpApplication app) {
    
                / / Hacer esto una vez para cada AppDomain.
                if (!_initialized) {
                    lock (_initLock) {
                        if (!_initialized) { 
    
                            string webenginePath = Path.Combine(RuntimeEnvironment.GetRuntimeDirectory(), "webengine.dll"); 
    
                            if (!File.Exists(webenginePath)) {
                                throw new Exception(String.Format(CultureInfo.InvariantCulture,
                                                                  "No se pudo encontrar webengine.dll en '{0}'.  Este módulo requiere .NET Framework 2.0.", 
                                                                  webenginePath));
                            } 
    
                            FileVersionInfo ver = FileVersionInfo.GetVersionInfo(webenginePath);
                            _sourceName = string.Format(CultureInfo.InvariantCulture, "ASP.NET {0}.{1}.{2}.0",
                                                        ver.FileMajorPart, ver.FileMinorPart, ver.FileBuildPart);
    
                            if (!EventLog.SourceExists(_sourceName)) {
                                throw new Exception(String.Format(CultureInfo.InvariantCulture,
                                                                  "No hay ningún origen EventLog con el nombre '{0}'. Este módulo requiere .NET Framework 2.0.", 
                                                                  _sourceName));
                            }
     
                            AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(OnUnhandledException);
     
                            _initialized = true;
                        }
                    }
                }
            }
    
            public void Dispose() {
            }
    
            void OnUnhandledException(object o, UnhandledExceptionEventArgs e) {
                // Dejar que esto se produzca una vez para cada AppDomain.
                if (Interlocked.Exchange(ref _unhandledExceptionCount, 1) != 0)
                    return;
    
                StringBuilder message = new StringBuilder("\r\n\r\nUnhandledException logged by UnhandledExceptionModule.dll:\r\n\r\nappId=");
    
                string appId = (string) AppDomain.CurrentDomain.GetData(".appId");
                if (appId != null) {
                    message.Append(appId);
                }
                
    
                Exception currentException = null;
                for (currentException = (Exception)e.ExceptionObject; currentException != null; currentException = currentException.InnerException) {
                    message.AppendFormat("\r\n\r\ntype={0}\r\n\r\nmessage={1}\r\n\r\nstack=\r\n{2}\r\n\r\n",
                                         currentException.GetType().FullName, 
                                         currentException.Message,
                                         currentException.StackTrace);
                }           
    
                EventLog Log = new EventLog();
                Log.Source = _sourceName;
                Log.WriteEntry(message.ToString(), EventLogEntryType.Error);
            }
    
        }
    }
  2. Guarde el archivo UnhandledExceptionModule.cs en la siguiente carpeta:
    C:\Program Files\Microsoft Visual Studio 8\VC
  3. Abra el símbolo del sistema de Microsoft Visual Studio 2005.
  4. Escriba sn.exe -k key.snk y, a continuación, presione ENTRAR.
  5. Escriba csc /t:library /r:system.web.dll,system.dll /keyfile:key.snk UnhandledExceptionModule.cs y, a continuación, presione ENTRAR.
  6. Escriba gacutil.exe /if UnhandledExceptionModule.dll y, a continuación, presione ENTRAR.
  7. Escriba ngen install UnhandledExceptionModule.dll y, a continuación, presione ENTRAR.
  8. Escriba gacutil /l UnhandledExceptionModule y, a continuación, presione ENTRAR para mostrar el nombre seguro del archivo UnhandledExceptionModule.
  9. 9. Agregue el código siguiente al archivo Web.config de la aplicación basada en ASP.NET.
    <add name="UnhandledExceptionModule" 
    	type="WebMonitor.UnhandledExceptionModule, <nombre seguro>" />

Método 2

Cambiar la directiva de excepciones no controladas por el comportamiento predeterminado que se produce en .NET Framework 1.1 y .NET Framework 1.0.

Nota: no se recomienda cambiar el comportamiento predeterminado. Si omite las excepciones, la aplicación puede carecer de recursos y abandonar los bloqueos.

Para habilitar este comportamiento predeterminado, agregue el siguiente código al archivo Aspnet.config que está ubicado en la siguiente carpeta:
%WINDIR%\Microsoft.NET\Framework\v2.0.50727
<configuración>
    <runtime>
        <legacyUnhandledExceptionPolicy enabled="true" />
    </runtime>
</configuración>

Estado

Este comportamiento es una característica del diseño de la aplicación.

Más información

Para obtener más información sobre los cambios en .NET Framework 2,0, visite el siguiente sitio web de Microsoft Developer Network (MSDN):
http://msdn2.microsoft.com/es-es/netframework/aa731542.aspx

Propiedades

Id. de artículo: 911816 - Última revisión: miércoles, 08 de enero de 2014 - Versión: 4.0
La información de este artículo se refiere a:
  • Microsoft .NET Framework 4.5
  • Microsoft .NET Framework 4.0
  • Microsoft .NET Framework 3.0
  • Microsoft .NET Framework 2.0
Palabras clave: 
kbtshoot kbfix kbprogramming kbprb KB911816

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com