Exceções não tratadas causam aplicativos inesperadamente no 2.0.NET Framework ASP.NET

Artigo: 911816 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

Quando uma exceção não tratada é lançada na Microsoft Aplicativo baseado em ASP.NET que é construído sobre o Microsoft.NET Framework 2.0, o aplicativo fecha inesperadamente. Quando esse problema não ocorre, nenhuma exceção as informações que você deve ter noções básicas sobre o problema são conectadas a Log de aplicativo.

No entanto, uma mensagem de evento que é semelhante a a seguir pode ser registrada no log do sistema:

Tipo de evento: Aviso
Origem do evento: W3SVC
Categoria do evento: nenhuma
Identificação de evento: 1009
Data: 28/9/2005
Tempo: 3: 18: 11
PM usuário: n/a
Computador: SERVIDOR IIS
Descrição:
Um pool de aplicativos de serviço do processo 'DefaultAppPool' terminou inesperadamente. A identificação do processo era '2548'. O código de saída do processo era '0xe0434f4d'.

Além disso, uma mensagem de evento Isto é semelhante à seguinte pode ser registrada no log do aplicativo:

Tipo de evento: erro
Origem do evento: .NET Runtime 2.0 Relatório de erros
Categoria do evento: nenhuma
Identificação de evento: 5000
Data: 28 de 9 de 2005
Tempo: 3: 18: 02 PM
Usuário: n/a
Computador: Servidor IIS
Descrição:
EventType clr20r3, W3wp. exe P1, P2 6.0.3790.1830, P3 42435be1, app_web_7437ep-9 P4, P5 0.0.0.0, 433b1670 P6, PU 9, P8, P9 Exception P10 NIL.

Causa

Esse problema ocorre porque a diretiva padrão para não tratada exceções mudou no 2.0.NET Framework. Por padrão, a diretiva para exceções sem tratamento é finalizar o processo de trabalho.

No Microsoft .NET Framework 1.0 1.1 e de.NET Framework Microsoft, sem tratamento exceções em threads gerenciados foram ignoradas. A menos que você anexou um depurador capturar a exceção, você não deve perceber que nada foi errado.

ASP.NET usa a diretiva padrão para exceções não tratadas na .NET Framework 2.0. Quando uma exceção não tratada é lançada, com base ASP.NET aplicativo fecha inesperadamente.

Esse comportamento não se aplica a exceções que ocorrem no contexto de uma solicitação. Esses tipos de exceções são manipulados e encapsulado por um objeto HttpException ainda. Não exceções que ocorrem no contexto de uma solicitação fazer com que o processo do operador finalizar. No entanto, sem tratamento exceções fora do contexto de uma solicitação, como exceções em um segmento do timer ou um retorno de chamada função, fazer com que o processo do operador finalizar.

Resolução

Para resolver esse problema, use um dos seguintes métodos.

Método 1

Modificar o código-fonte para o objeto IHttpModule para que ele irá registrar informações de exceção para o Log de aplicativo. Informações registradas serão os seguintes:
  • O caminho do diretório virtual no qual a exceção Ocorreu
  • O nome da exceção
  • A mensagem
  • O rastreamento de pilha
Para modificar o objeto IHttpModule , siga estas etapas.

Observação Esse código registrará uma mensagem que tem o tipo de evento de erro e a origem de evento de ASP.NET 2.0.50727.0 no log do aplicativo. Para testar o módulo, solicitar um ASP.NET página que usa o método QueueUserWorkItem para chamar um método que lança uma exceção não tratada.
  1. Coloque o código a seguir em um arquivo chamado. 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. Salve o arquivo UnhandledExceptionModule.cs para o seguinte pasta:
    C:\Program Files\Microsoft Visual Studio 8 \ VC
  3. Abra o comando Microsoft Visual Studio 2005 Prompt.
  4. Digite sn -k key.snke então Pressione ENTER.
  5. Digite CSC /t: Library /r:system.web.dll,system.dll /keyfile:Key.snk UnhandledExceptionModule.cse pressione DIGITE.
  6. Digite /if Gacutil. exe UnhandledExceptionModule.dll, e então pressione ENTER.
  7. Digite NGen install UnhandledExceptionModule.dll, e então pressione ENTER.
  8. Digite Gacutil /l UnhandledExceptionModule, e pressione ENTER para exibir o nome forte para o arquivo UnhandledExceptionModule .
  9. 9. Adicione o seguinte código ao arquivo Web. config do seu Aplicativo baseado em ASP.NET.
    <add name="UnhandledExceptionModule" 
    	type="WebMonitor.UnhandledExceptionModule, <strong name>" />

Método 2

Alterar a diretiva de exceção não tratada o comportamento padrão que ocorre no.NET Framework 1.1 e no.NET Framework 1.0.

Observação Não é recomendável que você alterar o comportamento padrão. Se você Ignorar exceções, o aplicativo pode vazar recursos e abandonar bloqueios.

Para habilitar esse comportamento padrão, adicione o seguinte código para o Arquivo ASPNET que está localizado na seguinte pasta:
%WINDIR%\Microsoft.NET\Framework\v2.0.50727
<configuration>
    <runtime>
        <legacyUnhandledExceptionPolicy enabled="true" />
    </runtime>
</configuration>

Ponto Da Situação

Isso comportamento é por design.

Mais Informação

Para obter mais informações sobre alterações no.NET Framework 2.0, visite o seguinte site da Microsoft Developer Network (MSDN):
http://msdn2.microsoft.com/en-US/netframework/aa570326.aspx

Propriedades

Artigo: 911816 - Última revisão: domingo, 30 de Setembro de 2012 - Revisão: 3.0
A informação contida neste artigo aplica-se a:
  • Microsoft .NET Framework 2.0
Palavras-chave: 
kbtshoot kbfix kbprogramming kbprb kbmt KB911816 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 911816

Submeter comentários