Artigo: 911816 - Última revisão: segunda-feira, 3 de Dezembro de 2007 - Revisão: 1.3

Excepções não processadas fazer com que aplicações baseadas no ASP.NET para inesperadamente no .NET Framework 2.0

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Reduzir tudo

Sintomas

Quando é accionada uma excepção não processada num Microsoft baseados no ASP.NET termina aplicação criada no Microsoft .NET Framework 2.0, a aplicação inesperadamente. Quando este problema ocorre, não informações de excepção que tem de ter noções sobre o problema são registadas no registo de aplicações.

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

Tipo de evento: aviso
Origem do evento: W3SVC
Categoria do 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 foi ? 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 do 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, w3wp.exe P1, P2 6.0.3790.1830, P3 42435be1 P4 app_web_7437ep-9, P5 0.0.0.0, P6 433b1670, P7 9, P8, P9 system.exception, P10 NIL.

Causa

Este problema ocorre porque a política predefinida de excepções não processadas foi alterada no .NET Framework 2.0. Por predefinição, a política para excepções não processadas é de 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. Apercebe-se ligado um depurador a detectar a excepção, seria não se que nada foi errado.

O ASP.NET utiliza a política predefinida para excepções não processadas no .NET Framework 2.0. 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 tratados e moldados por um objecto HttpException . Excepções que ocorrem no contexto de um pedido não causam o processo de trabalho terminar. No entanto, excepções não processadas fora do contexto de um pedido, tal como excepções num thread temporizador ou numa função 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

Modifique o código origem para o objecto IHttpModule isso-irá registar informações de excepção no registo de aplicações. As informações que estão ligadas incluem o seguinte:
  • O caminho do directório virtual na qual ocorreu a excepção
  • 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 a origem de eventos do ASP.NET 2.0.50727.0 e o tipo de evento de erro no registo de aplicações. Para testar o módulo, o pedido de ASP.NET uma página que utiliza o método ThreadPool.QueueUserWorkItem para chamar um método que inicia uma excepção não processada.
  1. Coloque o seguinte código num ficheiro 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);
            }
    
        }
    }
  2. Guarde o ficheiro UnhandledExceptionModule.cs para a seguinte pasta:
    C:\Program Files\Microsoft Visual Studio 8\VC
  3. Abra a linha de comandos Microsoft Visual Studio 2005.
  4. Escreva sn.exe -k key.snk e, em seguida, prima ENTER.
  5. Escreva csc /t:library /r:system.web.dll,system.dll /keyfile:key.snk UnhandledExceptionModule.cs e, em seguida, prima ENTER.
  6. Tipo gacutil.exe /if UnhandledExceptionModule.dll , e, em seguida, prima ENTER.
  7. Escreva ngen instalar UnhandledExceptionModule.dll e, em seguida, prima ENTER.
  8. Tipo gacutil /l UnhandledExceptionModule , e, em seguida, prima ENTER para apresentar o nome para o ficheiro UnhandledExceptionModule forte.
  9. 9. Adicione o seguinte código ao ficheiro Web.config da aplicação baseados no ASP.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 alterar o comportamento predefinido. Se ignorar excepções, a aplicação poderá divulgar recursos e abandonar bloqueios.

Para activar este comportamento predefinido, adicione o seguinte código para o ficheiro ASPNET.config que está localizado na pasta seguinte:
%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 obter mais informações sobre alterações no .NET Framework 2.0, visite o seguinte Web site da Microsoft Developer Network (MSDN):
http://msdn2.microsoft.com/en-us/netframework/aa570326.aspx (http://msdn2.microsoft.com/en-us/netframework/aa570326.aspx)

A informação contida neste artigo aplica-se a:
  • Microsoft .NET Framework 2.0
Palavras-chave: 
kbmt kbtshoot kbfix kbprogramming kbprb KB911816 KbMtpt
Tradução automáticaTraduçã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  (http://support.microsoft.com/kb/911816/en-us/ )