Las excepciones no controladas hacen que ASP.NET aplicaciones basadas en aplicaciones se cierren inesperadamente en el .NET Framework
Este artículo le ayuda a resolver el problema en el que las excepciones no controladas hacen que las ASP.NET basadas en aplicaciones se cierren inesperadamente en el .NET Framework.
Versión del producto original: .NET Framework 4.5
Número KB original: 911816
Nota
Este artículo se aplica a Microsoft .NET Framework 2.0 y todas las versiones posteriores.
Síntomas
Cuando se produce una excepción no controlada en una aplicación basada en ASP.NET que se basa en .NET Framework 2.0 y versiones posteriores, la aplicación se cierra inesperadamente. Cuando se produce este problema, no se registra en el registro de la aplicación ninguna información de excepción que deba tener para comprender el problema.
Sin embargo, es posible que se registre un mensaje de evento similar al siguiente ejemplo en el registro del sistema. Además, se puede registrar un mensaje de evento similar al ejemplo siguiente en el registro de aplicaciones.
Causa
Este problema se produce porque la directiva predeterminada para excepciones no controladas ha cambiado en el .NET Framework 2.0 y versiones posteriores. De forma predeterminada, la directiva para excepciones no controladas es finalizar el proceso de trabajo.
En la .NET Framework 1.1 y en el .NET Framework 1.0, se ignoraron las excepciones no controladas en subprocesos administrados. A menos que adjuntaste un depurador para detectar la excepción, no te darías cuenta de que todo estaba mal.
ASP.NET la directiva predeterminada para excepciones no controladas en el .NET Framework 2.0 y versiones posteriores. Cuando se produce una excepción no controlada, la aplicación basada ASP.NET se cierra inesperadamente.
Este comportamiento no se aplica a las excepciones que se producen en el contexto de una solicitud. Estos tipos de excepciones se siguen controlando y ajustando mediante un HttpException objeto. Las excepciones que se producen en el contexto de una solicitud no hacen que el proceso de trabajo finalice. 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 finalice.
Solución 1
Modifique el código fuente del objeto para que registre la información de IHttpModule excepción en el registro de la aplicación. La información que se registra incluirá lo siguiente:
- La ruta de acceso del directorio virtual en la que se produjo la excepción
- Nombre de excepción
- El mensaje
- Seguimiento de la pila
Para modificar el IHttpModule objeto, siga estos pasos.
Nota
Este código registrará un mensaje con el tipo de evento Error y el origen de eventos de ASP.NET 2.0.50727.0 en el registro de aplicaciones. Para probar el módulo, solicite una ASP.NET que use el método para llamar a un método que ThreadPool.QueueUserWorkItem produce una excepción no controlada.
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) { // 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); } } }Guarde el archivo UnhandledExceptionModule.cs en la
C:\Program Files\Microsoft Visual Studio 8\VCcarpeta.Abra el símbolo Visual Studio símbolo del sistema.
Escriba
sn.exe -k key.snky, a continuación, presione ENTRAR.Escriba
csc /t:library /r:system.web.dll,system.dll /keyfile:key.snk UnhandledExceptionModule.csy, a continuación, presione ENTRAR.Escriba
gacutil.exe /if UnhandledExceptionModule.dlly, a continuación, presione ENTRAR.Escriba
ngen install UnhandledExceptionModule.dlly, a continuación, presione ENTRAR.Escriba
gacutil /l UnhandledExceptionModuley, a continuación, presione ENTRAR para mostrar el nombre seguro del archivo UnhandledExceptionModule.Agregue el siguiente código al archivo Web.config de la aplicación ASP.NET base de datos.
<add name="UnhandledExceptionModule" type="WebMonitor.UnhandledExceptionModule, <strong name>" />
Solución 2
Vuelva a cambiar la directiva de excepción no controlada al comportamiento predeterminado que se produce en el .NET Framework 1.1 y en el .NET Framework 1.0.
Nota
No se recomienda cambiar el comportamiento predeterminado. Si omite excepciones, es posible que la aplicación filtre recursos y abandone los bloqueos.
Para habilitar este comportamiento predeterminado, agregue el siguiente código 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 una característica del diseño de la aplicación.
Más información
Para obtener más información acerca de los cambios en la .NET Framework 2.0, visite Breaking Changes in .NET Framework 2.0.