Exceptions non gérées entraînent des applications ASP.NET à fermer de façon inattendue dans le.NET Framework

Traductions disponibles Traductions disponibles
Numéro d'article: 911816 - Voir les produits auxquels s'applique cet article
Remarque :Cet article s'applique dans le Microsoft.NET Framework 2.0 et les versions ultérieures de tous.
Agrandir tout | Réduire tout

Sommaire

Symptômes

Lorsqu'une exception non gérée est levée dans une application ASP.NET qui est construite sur le Microsoft.NET Framework 2.0 ou une version ultérieure de Microsoft, l'application se ferme de façon inattendue. Lorsque ce problème se produit, aucune information d'exception que vous devez posséder pour comprendre le problème n'est enregistrée dans le journal d'Application.

Toutefois, un message d'événement semblable au suivant peut être enregistré dans le journal système :

Type d'événement : avertissement
Source de l'événement : W3SVC
Catégorie de l'événement : aucun
L'ID d'événement : 1009
Date : 9/28/2005
Durée : 3:18:11
PM utilisateur : n/a
L'ordinateur : Serveur IIS
Description :
Un processus servant le pool d'applications « DefaultAppPool » s'est arrêté de façon inattendue. L'id de processus était « 2548 ». Le code de sortie du processus était « 0xe0434f4d ».

En outre, un message d'événement semblable au suivant peut être enregistré dans le journal d'Application :

Type d'événement : erreur
Source de l'événement : .NET Runtime 2.0 le rapport d'erreurs
Catégorie de l'événement : aucun
L'ID d'événement : 5000
Date : 9/28/2005
Durée : 3:18:02 PM
Utilisateur : n/a
L'ordinateur : Serveur IIS
Description :
Type d'événement clr20r3, w3wp.exe P1, P2 6.0.3790.1830, 42435be1 P3, P4 app_web_7437ep-9, P5 0.0.0.0, 433b1670 P6, P7 9, P8, system.exception P9, P10 NIL.

Cause

Ce problème se produit car la stratégie des exceptions non gérées par défaut a été modifié dans le.NET Framework 2.0 et versions ultérieures. Par défaut, la stratégie des exceptions non gérées est à la fin du processus de travail.

Dans le Microsoft.NET Framework 1.1 et le Microsoft.NET Framework 1.0, les exceptions non gérées dans les threads managés ont été ignorées. Sauf si vous avez associé un débogueur pour intercepter l'exception, vous ne souhaitez pas réalisé que tout était erronée.

ASP.NET utilise la stratégie par défaut pour les exceptions non gérées dans le.NET Framework 2.0 et versions ultérieures. Lorsqu'une exception non gérée est levée, l'application ASP.NET se ferme de façon inattendue.

Ce comportement ne s'applique pas aux exceptions qui se produisent dans le contexte d'une demande. Ces types d'exceptions sont toujours traitées et encapsulées par un objet HttpException . Les exceptions qui se produisent dans le contexte d'une demande ne provoquent pas le processus de travail à la fin. Toutefois, les exceptions non gérées en dehors du contexte d'une demande, par exemple sur un thread de minuterie ou dans une fonction de rappel, les exceptions provoquent le processus de travail à la fin.

Résolution

Pour résoudre ce problème, appliquez l'une des méthodes suivantes.

Méthode 1

Modifiez le code source de l'objet IHttpModule afin qu'il enregistrera des informations d'exception dans le journal des applications. Les informations enregistrées seront sont les suivants :
  • Le chemin d'accès du répertoire virtuel dans lequel l'exceptionoccurred
  • Le nom de l'exception
  • Le message
  • La trace de la pile
Pour modifier l'objet IHttpModule , procédez comme suit.

Remarque : Ce code enregistre un message qui a le Type d'événement d'erreur et la Source d'événements de ASP.NET 2.0.50727.0 dans le journal d'Application. Pour tester le module, demandez une page ASP.NET qui utilise la méthode ThreadPool.QueueUserWorkItem pour appeler une méthode qui lève une exception non gérée.
  1. Placez le code suivant dans un fichier qui est 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. Enregistrez le fichier UnhandledExceptionModule.cs dans le followingfolder :
    C:\Program Files\Microsoft Visual Studio 8\VC
  3. Ouvrez l'invite de commandes Microsoft Visual Studio 2005.
  4. Type Sn.exe -k key.snket thenpress d'entrée.
  5. Type csc/t : library /r:system.web.dll,system.dll/keyfile:key.snk UnhandledExceptionModule.cset puis pressENTER.
  6. Type Gacutil.exe /ifUnhandledExceptionModule.dll, puis appuyez sur ENTRÉE.
  7. Type Ngen installUnhandledExceptionModule.dll, puis appuyez sur ENTRÉE.
  8. Type /lUnhandledExceptionModule de Gacutil, puis appuyez sur ENTRÉE pour afficher le nom de thestrong pour le fichier UnhandledExceptionModule .
  9. 9. Ajoutez le code suivant au fichier Web.config d'une application basée sur les yourASP.NET.
    <add name="UnhandledExceptionModule" 
    	type="WebMonitor.UnhandledExceptionModule, <strong name>" />

Méthode 2

Modifier la stratégie des exceptions non gérées au comportement par défaut qui se produit dans la version 1.1 de.NET Framework et dans.NET Framework 1.0.

Remarque : Il est déconseillé de modifier le comportement par défaut. Si vous ignorez les exceptions, l'application peut entraîner une fuite des ressources et abandonner les verrous.

Pour activer ce comportement par défaut, ajoutez le code suivant dans le fichier Aspnet.config qui se trouve dans le dossier suivant :
%WINDIR%\Microsoft.NET\Framework\v2.0.50727
<configuration>
    <runtime>
        <legacyUnhandledExceptionPolicy enabled="true" />
    </runtime>
</configuration>

Statut

Ce comportement est voulu par la conception.

Plus d'informations

Pour plus d'informations sur les modifications dans.NET Framework 2.0, accédez au site Web de Microsoft Developer Network (MSDN) suivant :
http://msdn2.Microsoft.com/en-us/NETFramework/aa570326.aspx

Propriétés

Numéro d'article: 911816 - Dernière mise à jour: lundi 7 octobre 2013 - Version: 2.0
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft .NET Framework 4.5
  • Microsoft .NET Framework 4.0
  • Microsoft .NET Framework 3.0
  • Microsoft .NET Framework 2.0
Mots-clés : 
kbtshoot kbfix kbprogramming kbprb kbmt KB911816 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu d'une traduction automatique réalisée par un logiciel Microsoft et non par un traducteur professionnel. Cette traduction automatique a pu aussi être révisée par la communauté Microsoft grâce à la technologie Community Translation Framework (CTF). Pour en savoir plus sur cette technologie, veuillez consulter la page http://support.microsoft.com/gp/machine-translation-corrections/fr. Microsoft vous propose en effet des articles traduits par des professionnels, des articles issus de traductions automatiques et des articles issus de traductions automatiques révisées par la communauté Microsoft, de manière à ce que vous ayez accès à tous les articles de notre Base de connaissances dans votre langue. Il est important de noter que les articles issus de la traduction automatique, y compris ceux révisés par la communauté Microsoft, peuvent contenir des erreurs de vocabulaire, de syntaxe ou de grammaire. Microsoft ne pourra être tenu responsable des imprécisions, erreurs, ainsi que de tout dommage résultant d?une traduction incorrecte du contenu ou de son utilisation par les clients.
La version anglaise de cet article est la suivante: 911816
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

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