Exceções não tratadas fazer com que aplicativos ASP.NET sejam encerrados inesperadamente no.NET Framework

Traduções deste artigo Traduções deste artigo
ID do artigo: 911816 - Exibir os produtos aos quais esse artigo se aplica.
ObservaçãoEste artigo se aplica para o Microsoft.NET Framework 2.0 e versões posteriores tudo.
Expandir tudo | Recolher tudo

Neste artigo

Sintomas

Quando é lançada uma exceção não tratada em um aplicativo baseado no ASP.NET que é construído sobre o Microsoft.NET Framework 2.0 ou uma versão posterior da Microsoft, o aplicativo é encerrado inesperadamente. Quando esse problema ocorrer, nenhuma informação de exceção que você precisa para entender o problema é registrada no log do aplicativo.

No entanto, uma mensagem de evento é semelhante à seguinte pode ser registrada no log do sistema:

Tipo de evento: aviso
Origem do evento: W3SVC
Categoria do evento: nenhuma
Identificação do evento: 1009
Data: 28/9/2005
Tempo: 3:18:11
PM usuário: n/d
Computador: Servidor IIS
Descrição:
Um processo que atende ao pool de aplicativos '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 é semelhante à seguinte pode ser registrada no log do aplicativo:

Tipo de evento: erro
Origem do evento: .NET Runtime 2.0 o relatório de erros
Categoria do evento: nenhuma
Identificação do evento: 5000
Data: 28/9/2005
Tempo: 3:18:02 PM
Usuário: n/d
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, P7 9, P8 Exception, P9, P10 NIL.

Causa

Esse problema ocorre porque a diretiva padrão para exceções sem tratamento foi alterado no.NET Framework 2.0 e versões posteriores. Por padrão, a diretiva de exceções sem tratamento é para finalizar o processo do operador.

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

ASP.NET usa a diretiva padrão para exceções sem tratamento no.NET Framework 2.0 e versões posteriores. Quando uma exceção é lançada, o aplicativo baseado no ASP.NET fecha inesperadamente.

Esse comportamento não se aplica às exceções que ocorrem no contexto de uma solicitação. Esses tipos de exceções ainda são tratados e delimitados por um objeto HttpException . Exceções que ocorrem no contexto de uma solicitação fazem com que o processo do operador finalizar. No entanto, exceções não tratadas fora do contexto de uma solicitação, como exceções em um segmento de temporizador ou em uma função de retorno de chamada, 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 registrará informações de exceção para o log do aplicativo. As informações registradas incluem o seguinte:
  • O caminho do diretório virtual no qual o exceptionoccurred
  • 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 tenha o tipo de evento de erro e a origem de eventos do ASP.NET 2.0.50727.0 no log do aplicativo. Para testar o módulo, solicite uma página ASP.NET que usa o método QueueUserWorkItem para chamar um método que lança uma exceção não tratada.
  1. Coloque o seguinte código em um arquivo que é namedUnhandledExceptionModule.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 followingfolder:
    C:\Program Files\Microsoft Visual Studio 8\VC
  3. Abra o Microsoft Visual Studio 2005 CommandPrompt.
  4. Tipo Sn.exe -k key.snke thenpress ENTER.
  5. Tipo CSC /t: Library /r:system.web.dll,system.dll/keyfile:key.snk UnhandledExceptionModule.cse, em seguida, pressione ENTER.
  6. Tipo Gacutil.exe /ifUnhandledExceptionModule.dll, e então pressione ENTER.
  7. Tipo installUnhandledExceptionModule.dll NGen, e então pressione ENTER.
  8. Tipo Gacutil /lUnhandledExceptionModule, e então pressione ENTER para exibir o nome de thestrong para o arquivo UnhandledExceptionModule .
  9. 9. Adicione o seguinte código no arquivo Web. config do aplicativo com base em yourASP.NET.
    <add name="UnhandledExceptionModule" 
    	type="WebMonitor.UnhandledExceptionModule, <strong name>" />

Método 2

Altere a diretiva de exceção sem tratamento para o comportamento padrão que ocorre no.NET Framework 1.1 e no.NET Framework 1.0.

Observação Não recomendamos que você altere o comportamento padrão. Se você ignorar exceções, o aplicativo pode vazar recursos e abandonar os bloqueios.

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

Situação

Esse comportamento é por design.

Mais Informações

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

Propriedades

ID do artigo: 911816 - Última revisão: segunda-feira, 7 de outubro de 2013 - Revisão: 2.0
A informação contida neste artigo aplica-se a:
  • Microsoft .NET Framework 4.5
  • Microsoft .NET Framework 4.0
  • Microsoft .NET Framework 3.0
  • Microsoft .NET Framework 2.0
Palavras-chave: 
kbtshoot kbfix kbprogramming kbprb kbmt KB911816 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido pelo software de tradução automática da Microsoft e eventualmente pode ter sido editado pela Microsoft Community através da tecnologia Community Translation Framework (CTF) ou por um tradutor profissional. A Microsoft oferece artigos traduzidos automaticamente por software, por tradutores profissionais e editados pela comunidade para que você tenha acesso a todos os artigos de nossa Base de Conhecimento em diversos idiomas. No entanto, um artigo traduzido pode conter erros de vocabulário, sintaxe e/ou gramática. A Microsoft não é responsável por qualquer inexatidão, erro ou dano causado por qualquer tradução imprecisa do conteúdo ou por seu uso pelos nossos clientes.
Clique aqui para ver a versão em Inglês deste artigo: 911816

Submeter comentários

 

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