Help and Support

Id. de artículo: 911816 - Última revisión: lunes, 03 de diciembre de 2007 - Versión: 1.3

Las excepciones no controladas que las aplicaciones basadas en ASP.NET inesperadamente en .NET Framework 2.0

En esta página

Expandir todo | Contraer todo

Síntomas

Cuando se produce una excepción no controlada en un Microsoft basadas en ASP.NET se cierra la aplicación que se integra en Microsoft .NET Framework 2.0, la aplicación inesperadamente. Cuando se produce este problema, no información de excepción que debe tener para comprender el problema se registra en el registro de aplicación.

Sin embargo, puede anotarse un mensaje de suceso similar al siguiente en el registro del sistema:

Tipo de suceso: advertencia
Origen del suceso: W3SVC
Categoría del suceso: ninguna
ID. de suceso: 1009
Fecha: 28/9/2005
Hora: 3: 18: 11
P.M. usuario: N/d
Equipo: IIS-SERVER
Descripción:
Un proceso para el grupo de aplicaciones ? DefaultAppPool ? terminó inesperadamente. El identificador del proceso era ? 2548 ?. El código de salida de proceso fue ? 0xe0434f4d ?.

Además, puede anotarse un mensaje de suceso similar al siguiente en el registro de aplicación:

Tipo de suceso: error
Origen del suceso: .NET Runtime 2.0 informe de errores
Categoría del suceso: ninguna
ID. de suceso: 5000
Fecha: 28/9/2005
Hora: 3: 18: 02 P.M.
Usuario: N/d
Equipo: IIS-SERVER
Descripción:
EventType clr20r3, w3wp.exe P1, P2 6.0.3790.1830, P3 42435be1, app_web_7437ep 4-9, P5 0.0.0.0, P6 433b1670, P7 9, P8, P9 system.exception, P10 NIL.

Causa

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

En Microsoft .NET Framework 1.1 y en Microsoft .NET Framework 1.0, se han ignorado las excepciones no controladas en subprocesos administrados. A menos que adjunta un depurador para detectar la excepción, podría no observa que nada no es correcto.

ASP.NET utiliza la directiva predeterminada para las excepciones no controladas en .NET Framework 2.0. Cuando se inicia una excepción no controlada, la aplicación basada en ASP.NET se cierra inesperadamente.

Este comportamiento no se aplica a las excepciones que ocurren en el contexto de una solicitud. Estos tipos de excepciones todavía se controlan y rodeados de un objeto HttpException . Las excepciones que ocurren en el contexto de una solicitud no hacen que el proceso de trabajo terminar. Sin embargo, las excepciones no controladas fuera del contexto de una solicitud, como excepciones en un subproceso de temporizador o en una función de devolución de llamada, hacen que el proceso de trabajo terminar.

Solución

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

Método 1

Modifique el código de origen para el objeto de IHttpModule de modo que registrará información de excepción en el registro de aplicación. La información que se registra incluirá las siguientes:
  • La ruta del directorio virtual en el que se produjo la excepción
  • El nombre de excepción
  • El mensaje
  • El seguimiento de pila
Para modificar el objeto de IHttpModule , siga estos pasos.

Nota Este código registrará un mensaje que tiene el tipo de evento de error y el origen de eventos de ASP.NET 2.0.50727.0 en el registro de aplicación. Para probar el módulo, solicitud de página ASP.NET que utiliza el método ThreadPool.QueueUserWorkItem para llamar a un método que inicia una excepción no controlada.
  1. Coloque el código siguiente en un archivo que se denomina 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) {
    
                // Do this one time for each 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,
                                                                  "Failed to locate webengine.dll at '{0}'.  This module requires .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,
                                                                  "There is no EventLog source named '{0}'. This module requires .NET Framework 2.0.", 
                                                                  _sourceName));
                            }
     
                            AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(OnUnhandledException);
     
                            _initialized = true;
                        }
                    }
                }
            }
    
            public void Dispose() {
            }
    
            void OnUnhandledException(object o, UnhandledExceptionEventArgs e) {
                // Let this occur one time for each 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 a la carpeta siguiente:
    C:\Archivos de programa\Microsoft Visual Studio 8\VC
  3. Abra el símbolo 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. Tipo gacutil.exe /if UnhandledExceptionModule.dll , y, a continuación, presione ENTRAR.
  7. Escriba ngen instalar UnhandledExceptionModule.dll y, a continuación, presione ENTRAR.
  8. Tipo gacutil /l UnhandledExceptionModule , y presione ENTRAR para mostrar el nombre seguro para el 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, <strong name>" />

Método 2

La directiva de excepción no controlada volver a cambiar el comportamiento predeterminado que se produce en .NET Framework 1.1 y en .NET Framework 1.0 a.

Nota No se recomienda que cambie el comportamiento predeterminado. Si pasa por alto las excepciones, la aplicación puede pérdida de recursos y abandonar bloqueos.

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

Estado

Este comportamiento es por diseño.

Más información

Para obtener más información sobre cambios en .NET Framework 2.0, visite el siguiente sitio Web de Microsoft Developer Network (MSDN):
http://msdn2.microsoft.com/en-us/netframework/aa570326.aspx (http://msdn2.microsoft.com/en-us/netframework/aa570326.aspx)

La información de este artículo se refiere a:
  • Microsoft .NET Framework 2.0
Palabras clave: 
kbmt kbtshoot kbfix kbprogramming kbprb KB911816 KbMtes
Traducción automáticaTraducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 911816  (http://support.microsoft.com/kb/911816/en-us/ )

Seleccione idioma

 

Related Support Centers