Αναγν. άρθρου: 911816 - Τελευταία αναθεώρηση: Παρασκευή, 24 Δεκεμβρίου 2010 - Αναθεώρηση: 2.0

Προκαλέσει ανεπίλυτες εξαιρέσεις, εφαρμογές που βασίζονται στο ASP.NET για να τερματιστεί απροσδόκητα στο .NET Framework 2.0

Συμβουλή συστήματοςΑυτό το άρθρο ισχύει για διαφορετικό λειτουργικό σύστημα από αυτό που χρησιμοποιείτε. Το περιεχόμενο του άρθρου που ενδέχεται να μην σας αφορά έχει απενεργοποιηθεί.

Σε αυτήν τη σελίδα

Ανάπτυξη όλων | Σύμπτυξη όλων

Συμπτώματα

Όταν μια ανεπίλυτη εξαίρεση στο Microsoft ASP.NET με εφαρμογή, η οποία είναι ενσωματωμένη στο Microsoft .NET Framework 2.0, η εφαρμογή απροσδόκητα κλείνει. Όταν παρουσιαστεί αυτό το ζήτημα, υπάρχουν πληροφορίες εξαίρεσης που είναι απαραίτητα για την κατανόηση του ζητήματος καταγράφεται στο αρχείο καταγραφής εφαρμογής.

Ωστόσο, ενδέχεται να καταγραφεί ένα μήνυμα συμβάντος που είναι παρόμοιο με το ακόλουθο στο αρχείο καταγραφής συστήματος:

Τύπος συμβάντος: προειδοποίηση
Προέλευση συμβάντος: W3SVC
Κατηγορία συμβάντος: καμία
Το Αναγνωριστικό συμβάντος: 1009
Ημερομηνία: 9/28/2005
Χρόνος: 3: 18: 11
Χρήστης ΜΜ: δ/Υ
Υπολογιστή: Οι υπηρεσίες IIS-SERVER
Περιγραφή:
Μια διαδικασία που εξυπηρετεί το χώρο συγκέντρωσης εφαρμογών ‘ DefaultAppPool ’ τερματίστηκε απροσδόκητα. Το αναγνωριστικό της διαδικασίας ήταν ‘ 2548 ’. Ο κωδικός εξόδου της διαδικασίας ‘ 0xe0434f4d ’.

Επιπλέον, ενδέχεται να καταγραφεί ένα μήνυμα συμβάντος που είναι παρόμοιο με το ακόλουθο στο αρχείο καταγραφής εφαρμογής:

Τύπος συμβάντος (Event Type): Σφάλμα (Error)
Στοιχείο χρόνου εκτέλεσης .NET προέλευση συμβάντος: 2.0 αναφοράς σφαλμάτων
Κατηγορία συμβάντος: καμία
Το Αναγνωριστικό συμβάντος: 5000
Ημερομηνία: 9/28/2005
Χρόνος: 3: 18: 02 μμ
Χρήστης: δ/Υ
Υπολογιστή: Οι υπηρεσίες IIS-SERVER
Περιγραφή:
Clr20r3 EventType, 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 α, P9 system.exception, P10 NIL.

Αιτία

Αυτό το ζήτημα προκύπτει επειδή έχει αλλάξει η προεπιλεγμένη πολιτική για ανεπίλυτες εξαιρέσεις στο .NET Framework 2.0. Από προεπιλογή, η πολιτική για ανεπίλυτες εξαιρέσεις είναι για να τερματίσετε τη διεργασία.

Με το Microsoft .NET Framework 1.1 και το Microsoft .NET Framework 1.0, αγνοήθηκαν ανεπίλυτες εξαιρέσεις σε διαχειριζόμενο νημάτων. Αν δεν προσαρτηθεί ένα πρόγραμμα εντοπισμού σφαλμάτων για να τραβήξετε την εξαίρεση, δεν θα αντιληφθούν οτιδήποτε ήταν εσφαλμένη.

Το ASP.NET χρησιμοποιεί την προεπιλεγμένη πολιτική για ανεπίλυτες εξαιρέσεις στο .NET Framework 2.0. Όταν είναι μια ανεπίλυτη εξαίρεση, η εφαρμογή που βασίζεται στο ASP.NET τερματίζεται απροσδόκητα.

Η συμπεριφορά αυτή δεν ισχύει για εξαιρέσεις που παρουσιάζονται στο περιβάλλον μιας αίτησης. Αυτά τα είδη των εξαιρέσεων εξακολουθεί να είναι ο χειρισμός και αναδίπλωση κειμένου από έναHttpExceptionObject. Εξαιρέσεις που παρουσιάζονται στο περιβάλλον μιας αίτησης δεν προκαλούν τη διαδικασία εργασίας στο τέλος. Ωστόσο, ανεπίλυτες εξαιρέσεις έξω από το περιβάλλον μιας αίτησης, όπως οι εξαιρέσεις σε ένα νήμα χρονιστή ή μιας συνάρτησης επιστροφής κλήσης, έχει ως αποτέλεσμα η διαδικασία εργασίας στο τέλος.

Προτεινόμενη αντιμετώπιση

Για την επίλυση αυτού του ζητήματος, χρησιμοποιήστε μία από τις ακόλουθες μεθόδους.

Μέθοδος 1

Τροποποιήστε τον κώδικα προέλευσης για τοIHttpModuleτο αντικείμενο, έτσι ώστε να θα καταγράφει πληροφορίες εξαίρεσης στο αρχείο καταγραφής εφαρμογής. Οι πληροφορίες που καταγράφεται περιλαμβάνουν τα εξής:
  • Η διαδρομή εικονικού καταλόγου στην οποία παρουσιάστηκε η εξαίρεση
  • Το όνομα εξαίρεσης
  • Το μήνυμα
  • Η ανίχνευση στοίβας
Για να τροποποιήσετε τοIHttpModuleαντικείμενο, ακολουθήστε τα εξής βήματα.

ΣΗΜΕΙΩΣΗΑυτός ο κωδικός θα καταγράφει ένα μήνυμα που περιέχει τον τύπο συμβάντος τηςΣΦΑΛΜΑκαι την προέλευση τουΤΟ ASP.NET 2.0.50727.0στο αρχείο καταγραφής εφαρμογής. Για να δοκιμάσετε τη λειτουργική μονάδα, αίτησης ASP.NET μια σελίδα που χρησιμοποιεί τοThreadPool.QueueUserWorkItemμέθοδος για την κλήση μιας μεθόδου που παρουσιάζει μια εξαίρεση που δεν αντιμετωπίστηκε.
  1. Τοποθετήστε τον παρακάτω κώδικα σε ένα αρχείο που ονομάζεται 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. Αποθηκεύστε το αρχείο UnhandledExceptionModule.cs στον ακόλουθο φάκελο:
    C:\Program Files\Microsoft Visual Studio 8\VC
  3. Ανοίξτε μια γραμμή εντολών της Microsoft Visual Studio 2005.
  4. TYPEsn.exe key.snk -kκαι κατόπιν πατήστε το πλήκτρο ENTER.
  5. TYPECSC /t:library /r:system.web.dll,system.dll /keyfile:key.snk UnhandledExceptionModule.csκαι κατόπιν πατήστε το πλήκτρο ENTER.
  6. TYPEgacutil.exe UnhandledExceptionModule.dll /ifκαι κατόπιν πατήστε το πλήκτρο ENTER.
  7. TYPEngen εγκατάσταση UnhandledExceptionModule.dllκαι κατόπιν πατήστε το πλήκτρο ENTER.
  8. TYPEgacutil /l UnhandledExceptionModule, και στη συνέχεια πιέστε το πλήκτρο ENTER για να εμφανίσετε το ισχυρό όνομα για τοUnhandledExceptionModuleFILE.
  9. 9. Προσθέστε τον ακόλουθο κώδικα στο αρχείο Web.config της εφαρμογής σας με ASP.NET.
    <add name="UnhandledExceptionModule" 
    	type="WebMonitor.UnhandledExceptionModule, <strong name>" />

Μέθοδος 2

Αλλάξτε την πολιτική ανεπίλυτη εξαίρεση την προεπιλεγμένη συμπεριφορά που παρουσιάζεται στο .NET Framework 1.1 και το .NET Framework 1.0.

ΣΗΜΕΙΩΣΗΔεν συνιστούμε να αλλάξετε την προεπιλεγμένη συμπεριφορά. Εάν παραβλέψετε εξαιρέσεις, η εφαρμογή μπορεί να διαρροή πόρων και να εγκαταλείψετε κλειδώματα.

Για να ενεργοποιήσετε αυτήν την προεπιλεγμένη συμπεριφορά, προσθέστε τον ακόλουθο κώδικα στο αρχείο Aspnet.config που βρίσκεται στον ακόλουθο φάκελο:
%WINDIR%\Microsoft.NET\Framework\v2.0.50727
<configuration>
    <runtime>
        <legacyUnhandledExceptionPolicy enabled="true" />
    </runtime>
</configuration>

Κατάσταση

Αυτή η συμπεριφορά οφείλεται στη σχεδίαση.

Περισσότερες πληροφορίες

For more information about changes in the .NET Framework 2.0, visit the following Microsoft Developer Network (MSDN) Web site:
http://msdn2.microsoft.com/en-us/netframework/aa570326.aspx (http://msdn2.microsoft.com/en-us/netframework/aa570326.aspx)

Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft .NET Framework 2.0
Λέξεις-κλειδιά: 
kbtshoot kbfix kbprogramming kbprb kbmt KB911816 KbMtel
Μηχανικά μεταφρασμένοΜηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:911816  (http://support.microsoft.com/kb/911816/en-us/ )