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

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 911816 - Δείτε τα προϊόντα στα οποία αναφέρεται το συγκεκριμένο άρθρο.
ΣημείωσηΑυτό το άρθρο ισχύει για το Microsoft .NET Framework 2.0 και όλες τις νεότερες εκδόσεις.
Ανάπτυξη όλων | Σύμπτυξη όλων

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

Συμπτώματα

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

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

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

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

Τύπος συμβάντος: σφάλμα
Προέλευση συμβάντος: .NET αναφοράς σφαλμάτων χρόνου εκτέλεσης 2.0
Κατηγορία συμβάντος: καμία
Το Αναγνωριστικό συμβάντος: 5000
Ημ/νία: 9/28/2005
Διάρκεια: 3:18:02 μμ
Χρήστης: δ/υ
Ο υπολογιστής: ΔΙΑΚΟΜΙΣΤΉΣ των υπηρεσιών IIS
Περιγραφή:
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, system.exception P9, P10 ΝΊΛΑ.

Αιτία

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

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

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

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

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

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

Μέθοδος 1

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

Σημείωση Αυτός ο κωδικός θα καταγράφει ένα μήνυμα που περιέχει τον τύπο του σφάλματος του συμβάντος και η προέλευση συμβάντος του ASP.NET 2.0.50727.0 στο αρχείο καταγραφής εφαρμογής. Για να ελέγξετε τη λειτουργική μονάδα, ζητήσει μια σελίδα ASP.NET, η οποία χρησιμοποιεί τη μέθοδο ThreadPool.QueueUserWorkItem για να καλέσει μια μέθοδο που δημιουργεί μια εξαίρεση που δεν αντιμετωπίστηκε.
  1. Εισαγάγετε τον ακόλουθο κώδικα σε ένα αρχείο που είναι 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. Αποθηκεύστε το αρχείο UnhandledExceptionModule.cs για να το followingfolder:
    C:\Program Files\Microsoft 8\VC του Visual Studio
  3. Ανοίξτε το CommandPrompt του Microsoft Visual Studio 2005.
  4. Τύπος key.snk -k SN.exe, και thenpress ENTER.
  5. Τύπος CSC /t:library /r:system.web.dll,system.dll/keyfile:key.snk UnhandledExceptionModule.cs, και στη συνέχεια pressENTER.
  6. Τύπος gacutil.exe /ifUnhandledExceptionModule.dll, και στη συνέχεια πιέστε το πλήκτρο ENTER.
  7. Τύπος NGEN installUnhandledExceptionModule.dll, και στη συνέχεια πιέστε το πλήκτρο ENTER.
  8. Τύπος gacutil /lUnhandledExceptionModule, και στη συνέχεια πιέστε το πλήκτρο ENTER για να εμφανίσετε το όνομα thestrong για το αρχείο UnhandledExceptionModule .
  9. 9. Προσθέστε τον ακόλουθο κώδικα στο αρχείο Web.config της εφαρμογής που βασίζεται στο yourASP.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>

Κατάσταση

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

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

Για περισσότερες πληροφορίες σχετικά με τις αλλαγές στο .NET Framework 2.0, επισκεφθείτε την ακόλουθη τοποθεσία Web Microsoft Developer Network (MSDN):
http://msdn2.Microsoft.com/en-US/netframework/aa570326.aspx

Ιδιότητες

Αναγν. άρθρου: 911816 - Τελευταία αναθεώρηση: Πέμπτη, 10 Οκτωβρίου 2013 - Αναθεώρηση: 3.0
Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft .NET Framework 4.5
  • Microsoft .NET Framework 4.0
  • Microsoft .NET Framework 3.0
  • Microsoft .NET Framework 2.0
Λέξεις-κλειδιά: 
kbtshoot kbfix kbprogramming kbprb kbmt KB911816 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο έχει μεταφραστεί χρησιμοποιώντας λογισμικό μηχανικής μετάφρασης της Microsoft και μπορείτε να το διορθώσετε χρησιμοποιώντας την τεχνολογία Community Translation Framework (CTF) (Πλαίσιο μετάφρασης κοινότητας). Η Microsoft παρέχει μηχανική μετάφραση, επεξεργασία μετά τη μηχανική μετάφραση από την κοινότητα και άρθρα μεταφρασμένα από επαγγελματίες προκειμένου να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής βάσης σε πολλές γλώσσες. Τα άρθρα μηχανικής μετάφρασης και αυτά που επεξεργάζονται ύστερα από μηχανική μετάφραση ενδέχεται να περιέχουν σφάλματα στο λεξιλόγιο, στη σύνταξη ή/και στη γραμματική. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες μας. Για περισσότερες πληροφορίες σχετικά με το CTF, μεταβείτε στην τοποθεσία http://support.microsoft.com/gp/machine-translation-corrections/el.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη: 911816

Αποστολή σχολίων

 

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