Pengecualian tidak menyebabkan aplikasi berbasis ASP.NET berhenti mendadak di .NET Framework

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 911816 - Melihat produk di mana artikel ini berlaku.
CatatanArtikel ini berlaku untuk Microsoft .NET Framework 2.0 dan semua versi.
Perbesar semua | Perkecil semua

Pada Halaman ini

Gejala

Ketika pengecualian tidak dibuang di Microsoft ASP.NET berbasis aplikasi yang dibangun di Microsoft.NET Framework 2.0 atau versi yang lebih baru, aplikasi tiba-tiba berhenti. Ketika masalah ini terjadi, tidak ada pengecualian informasi yang harus Anda miliki untuk memahami masalah login di log aplikasi.

Namun, pesan acara yang mirip dengan berikut ini mungkin login di log sistem:

Jenis peristiwa: peringatan
Sumber peristiwa: W3SVC
Kategori peristiwa: tidak ada
ID peristiwa: 1009
Tanggal: 9/28/2005
Waktu: 3:18:11
PM pengguna: N/A
Komputer: IIS-SERVER
Keterangan:
Sebuah proses yang melayani kolam aplikasi 'DefaultAppPool' berakhir tiba-tiba. Proses id adalah '2548'. Kode keluar proses adalah '0xe0434f4d'.

Selain itu, pesan acara yang mirip dengan berikut ini mungkin login di log aplikasi:

Jenis peristiwa: kesalahan
Sumber peristiwa: .NET pelaporan kesalahan Runtime 2.0
Kategori peristiwa: tidak ada
ID peristiwa: 5000
Tanggal: 9/28/2005
Waktu: 3:18:02 PM
Pengguna: N/A
Komputer: IIS-SERVER
Keterangan:
EventType 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 NIL.

Penyebab

Masalah ini terjadi karena kebijakan default untuk pengecualian tidak tertangani telah berubah di .NET Framework 2.0 dan versi yang lebih baru. secara asali, kebijakan untuk tidak tertangani pengecualian adalah untuk mengakhiri proses pekerja.

Di Microsoft.NET Framework 1.1 dan di Microsoft.NET Framework 1.0, tidak tertangani pengecualian pada benang dikelola diabaikan. Kecuali Anda terpasang debugger untuk menangkap pengecualian, Anda tidak akan menyadari bahwa ada yang salah.

ASP.NET menggunakan kebijakan default untuk tidak tertangani pengecualian di .NET Framework 2.0 dan versi yang lebih baru. Ketika pengecualian tidak dibuang, aplikasi berbasis ASP.NET tiba-tiba berhenti.

Perilaku ini tidak sahih untuk pengecualian yang terjadi dalam konteks permintaan. Jenis-jenis pengecualian masih ditangani dan dibungkus dengan HttpException objek. Pengecualian yang terjadi dalam konteks permintaan tidak menyebabkan proses pekerja untuk mengakhiri. Namun, tidak tertangani pengecualian di luar konteks permintaan, seperti pengecualian pada timer thread atau dalam fungsi panggilan balik, menyebabkan proses pekerja untuk mengakhiri.

Pemecahan masalah

Untuk mengatasi masalah ini, gunakan salah satu metode berikut.

Metode 1

Memodifikasi kode sumber untuk objek IHttpModule sehingga akan mendata informasi pengecualian untuk log aplikasi. Informasi yang dicatat akan meliputi:
  • garis jatuh berseri direktori maya di mana exceptionoccurred
  • Nama pengecualian
  • Pesan
  • Pelacakan stack
Untuk memodifikasi objek IHttpModule , ikuti langkah berikut.

Catatan Kode ini akan log pesan yang memiliki acara jenis kesalahan dan sumber ASP.NET 2.0.50727.0 peristiwa di log aplikasi. Untuk menguji modul, meminta halaman ASP.NET yang menggunakan metode ThreadPool.QueueUserWorkItem untuk memanggil metode yang throws pengecualian tidak tertangani.
  1. Menempatkan kode berikut dalam file yang 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. Menyimpan UnhandledExceptionModule.cs file ke followingfolder:
    Program C:\Program 8\VC Visual Studio
  3. Buka Microsoft Visual Studio 2005 CommandPrompt.
  4. Jenis SN.exe -k key.snk, dan thenpress ENTER.
  5. Jenis CSC /t:library /r:system.web.dll,system.dll/keyfile:key.snk UnhandledExceptionModule.cs, dan kemudian pressENTER.
  6. Jenis gacutil.exe /ifUnhandledExceptionModule.dll, kemudian tekan ENTER.
  7. Jenis Ngen installUnhandledExceptionModule.dll, kemudian tekan ENTER.
  8. Jenis gacutil /lUnhandledExceptionModule, kemudian tekan ENTER untuk menampilkan thestrong nama untuk UnhandledExceptionModule file.
  9. 9. Tambahkan kode berikut ke file Web.config aplikasi berbasis yourASP.NET.
    <add name="UnhandledExceptionModule" 
    	type="WebMonitor.UnhandledExceptionModule, <strong name>" />

Metode 2

Mengubah kebijakan eksepsi tidak tertangani kembali ke perilaku default yang terjadi dalam .NET Framework 1.1 dan .NET Framework 1.0.

Catatan Kami tidak menganjurkan bahwa Anda mengubah perilaku default. Jika Anda mengabaikan pengecualian, aplikasi mungkin bocor sumber daya dan meninggalkan bukti kunci.

Untuk mengaktifkan perilaku default ini, tambahkan kode berikut ke file Aspnet.config yang terletak di map berikut:
%WINDIR%\Microsoft.NET\Framework\v2.0.50727
<configuration>
    <runtime>
        <legacyUnhandledExceptionPolicy enabled="true" />
    </runtime>
</configuration>

Status

Perilaku ini adalah dengan desain.

Informasi lebih lanjut

Untuk informasi lebih lanjut tentang perubahan dalam .NET Framework 2.0, kunjungi website Microsoft Developer Network (MSDN) berikut:
http://msdn2.Microsoft.com/en-US/netframework/aa570326.aspx

Properti

ID Artikel: 911816 - Kajian Terakhir: 07 Oktober 2013 - Revisi: 2.0
Berlaku bagi:
  • Microsoft .NET Framework 4.5
  • Microsoft .NET Framework 4
  • Microsoft .NET Framework 3.0
  • Microsoft .NET Framework 2.0
Kata kunci: 
kbtshoot kbfix kbprogramming kbprb kbmt KB911816 KbMtid
Penerjemahan Mesin
PENTING: Artikel ini diterjemahkan oleh perangkat lunak penerjemahan mesin Microsoft, dan mungkin telah diedit oleh Masyarakat Microsoft melalui teknologi CTF dan bukan oleh seorang penerjemah profesional. Microsoft menawarkan baik artikel yang diterjemahkan oleh manusia maupun artikel hasil editan terjemahan oleh mesin/komunitas, sehingga Anda dapat mengakses semua artikel di Sentra Pengetahuan yang kami miliki dalam berbagai bahasa. Namun artikel hasil editan mesin atau bahkan komunitas tidak selalu sempurna. Artikel ini dapat mengandung kesalahan dalam hal kosa kata, sintaksis atau tatabahasa, sangat mirip dengan penutur asing yang membuat kekeliruan ketika berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab atas ketidakakuratan, kesalahan atau kerugian apa pun akibat dari kekeliruan dalam penerjemahan isi atau penggunaannya oleh pelanggan kami. Microsoft juga akan senantiasa memperbarui perangkat lunak penerjemahan mesin dan alat untuk menyempurnakan Editan Hasil Penerjemahan Mesin.
Klik disini untuk melihat versi Inggris dari artikel ini: 911816

Berikan Masukan

 

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