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

Σημείωση Αυτό το άρθρο ισχύει για το Microsoft .NET Framework 2.0 και όλες τις νεότερες εκδόσεις.

Συμπτώματα

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

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

Αιτία

Αυτό το ζήτημα παρουσιάζεται επειδή έχει αλλάξει την προεπιλεγμένη πολιτική για ανεπίλυτες εξαιρέσεις στο .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 , έτσι ώστε να θα καταγράψει πληροφορίες εξαίρεσης στο αρχείο καταγραφής εφαρμογών. Οι πληροφορίες που καταγράφεται θα περιλαμβάνουν τα εξής:
  • Η διαδρομή του εικονικού καταλόγου στο οποίο παρουσιάστηκε η εξαίρεση
  • Το όνομα εξαίρεσης
  • Το μήνυμα
  • Το ίχνος στοίβας
Για να τροποποιήσετε το αντικείμενο 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 8\VC Visual Studio
  3. Ανοίξτε τη γραμμή εντολών του Microsoft Visual Studio 2005.
  4. Πληκτρολογήστε sn.exe key.snk -kκαι, στη συνέχεια, πιέστε το πλήκτρο ENTER.
  5. Πληκτρολογήστε csc /t:library /r:system.web.dll,system.dll /keyfile:key.snk UnhandledExceptionModule.csκαι, στη συνέχεια, πιέστε το πλήκτρο ENTER.
  6. Πληκτρολογήστε gacutil.exe /if UnhandledExceptionModule.dllκαι, στη συνέχεια, πιέστε το πλήκτρο ENTER.
  7. Πληκτρολογήστε ngen εγκατάσταση UnhandledExceptionModule.dllκαι, στη συνέχεια, πιέστε το πλήκτρο ENTER.
  8. Πληκτρολογήστε gacutil/l UnhandledExceptionModuleκαι, στη συνέχεια, πιέστε το πλήκτρο ENTER για να εμφανίσετε το ισχυρό όνομα για το αρχείο UnhandledExceptionModule .
  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>

Κατάσταση

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

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

Για περισσότερες πληροφορίες σχετικά με τις αλλαγές στο .NET Framework 2.0, επισκεφθείτε την ακόλουθη τοποθεσία του Microsoft Developer Network (MSDN) στο Web:
Ιδιότητες

Αναγνωριστικό άρθρου: 911816 - Τελευταία αναθεώρηση: 17 Ιαν 2017 - Αναθεώρηση: 1

Microsoft .NET Framework 4.5, Microsoft .NET Framework 4.0, Microsoft .NET Framework 3.0, Microsoft .NET Framework 2.0

Σχόλια