Excepções não processadas fazer com que aplicações baseadas em ASP.NET a ser encerrado inesperadamente no .NET Framework

Traduções de Artigos Traduções de Artigos
Artigo: 911816 - Ver produtos para os quais este artigo se aplica.
NotaEste artigo aplica-se para o Microsoft .NET Framework 2.0 e versões posteriores de todas as.
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

Quando um aplicação baseada em ASP.NET que se baseia no Microsoft .NET Framework 2.0 ou uma versão posterior do Microsoft é emitida uma excepção não processada, o aplicativo é encerrado inesperadamente. Quando este problema ocorre, nenhuma informação de excepção que tem de ter noções sobre o problema é registada no registo de aplicações.

No entanto, poderá ser registada uma mensagem de evento que é semelhante à seguinte no registo do sistema:

Tipo de evento: aviso
Origem do evento: W3SVC
Categoria de evento: nenhum
ID do evento: 1009
Data: 9/28/2005
Hora: 3:18:11
PM utilizador: n/d
Computador: Servidor de IIS
Descrição:
Um processo que fornecia serviços ao agrupamento de aplicações 'DefaultAppPool' terminou inesperadamente. O id de processo era '2548'. O código de saída do processo era '0xe0434f4d'.

Além disso, uma mensagem de evento que é semelhante à seguinte poderá ser registada no registo de aplicações:

Tipo de evento: erro
Origem do evento: .NET Runtime 2.0 relato de erros
Categoria de evento: nenhum
ID do evento: 5000
Data: 9/28/2005
Hora: 3:18:02 PM
Utilizador: n/d
Computador: Servidor de IIS
Descrição:
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, Exception P9, P10 NIL.

Causa

Este problema ocorre porque a política predefinida para excepções não processadas foi alterada no .NET Framework 2.0 e versões posteriores. Por predefinição, é a política para excepções não processadas terminar o processo de trabalho.

No Microsoft .NET Framework 1.1 e no Microsoft .NET Framework 1.0, excepções não processadas em threads geridos foram ignoradas. A menos que o ligou um depurador a detectar a excepção, não seria perceber que nada foi errado.

O ASP.NET utiliza a política predefinida para excepções não processadas no .NET Framework 2.0 e versões posteriores. Quando é accionada uma excepção não processada, a aplicação baseada em ASP.NET encerra inesperadamente.

Este comportamento não se aplica às excepções que ocorrem no contexto de um pedido. Estes tipos de excepções ainda são processados e acondicionados por um objecto HttpException . Excepções que ocorrem no contexto de um pedido não causam terminar o processo de trabalho. No entanto, as excepções não processadas fora do contexto de um pedido, tal como excepções num thread temporizador ou numa função de chamada de retorno, fazer com que o processo de trabalho terminar.

Resolução

Para resolver este problema, utilize um dos seguintes métodos.

Método 1

Modificar o código de origem para o objecto IHttpModule para que registará as informações de excepção ao registo da aplicação. As informações registadas incluem o seguinte:
  • O caminho do directório virtual em que o exceptionoccurred
  • O nome da excepção
  • A mensagem
  • O rastreio da pilha
Para modificar o objecto IHttpModule , siga estes passos.

Nota Este código registará uma mensagem com o tipo de evento de erro e a origem do evento do ASP.NET 2.0.50727.0 no registo de aplicações. Para testar o módulo, solicitar uma página ASP.NET que utiliza o método de ThreadPool.QueueUserWorkItem para chamar um método que inicia uma excepção não processada.
  1. Coloque o seguinte código num ficheiro 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. Guarde o ficheiro de UnhandledExceptionModule.cs a followingfolder:
    C:\Program Files\Microsoft 8\VC do Visual Studio
  3. Abra o CommandPrompt de Studio 2005 Microsoft Visual.
  4. Tipo sn.exe -k key.snke thenpress ENTER.
  5. Tipo csc /t /r:system.web.dll,system.dll/keyfile:key.snk UnhandledExceptionModule.cse, em seguida, pressENTER.
  6. Tipo Gacutil.exe /ifUnhandledExceptionModule.dll, e, em seguida, prima ENTER.
  7. Tipo ngen installUnhandledExceptionModule.dll, e, em seguida, prima ENTER.
  8. Tipo gacutil /lUnhandledExceptionModule, e, em seguida, prima ENTER para apresentar o nome de thestrong para o ficheiro UnhandledExceptionModule .
  9. 9. Adicione o seguinte código para o ficheiro Web. config da aplicação baseada em yourASP.NET.
    <add name="UnhandledExceptionModule" 
    	type="WebMonitor.UnhandledExceptionModule, <strong name>" />

Método 2

Altere a política de excepção não processada novamente para o comportamento predefinido que ocorre no .NET Framework 1.1 e no .NET Framework 1.0.

Nota Não recomendamos que altere o comportamento predefinido. Se ignorar excepções, a aplicação poderá permitir fugas de recursos e abandonar bloqueios.

Para activar este comportamento predefinido, adicione o seguinte código para o ficheiro do 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

Este comportamento ocorre por predefinição.

Mais Informação

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

Propriedades

Artigo: 911816 - Última revisão: 7 de outubro de 2013 - Revisão: 5.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 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

 

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