Makale numarası: 911816 - Son Gözden Geçirme: 03 Aralık 2007 Pazartesi - Gözden geçirme: 1.3

Işlenemeyen özel duruma ASP.NET tabanlı uygulamaları, .NET Framework 2. 0 ' [NULL]'beklenmedik şekilde kapanmasına neden

Sistem İpucuBu makale, kullandığınızdan farklı bir işletim sistemine yöneliktir. Sizinle ilgili olmayabilecek makale içeriği devre dışı bırakıldı.

Bu Sayfada

Hepsini aç | Hepsini kapa

Belirtiler

Işlenmeyen bir özel durum, bir Microsoft ASP.NET tabanlı yaratıldığında Microsoft .NET Framework'ü 2.0, uygulama beklenmedik biçimde oluşturulmuş uygulama sonlandırılıyor. Bu sorun oluştuğunda, sorunu anlamak için gerekli olan hiçbir özel durum bilgileri uygulama günlüğüne kaydedilir.

Ancak, sistem günlüğüne aşağıdakine benzer bir olay iletisi kaydedilebilir:

Olay türü: uyarı
Olay kaynağı: W3SVC
Olay kategorisi: yok
Olay KIMLIĞI: 1009
Tarihi: 9/28/2005
Süre: 3: 18: 11
PM kullanıcı: N/A
Bilgisayar: IIS SERVER
Açıklama:
Uygulama havuzuna hizmet veren BIR işlem ‘ DefaultAppPool ’ beklenmedik şekilde sonlandırıldı. Işlem kimliği olan ‘ 2548 ’. Işlem çıkış kodu ‘ 0xe0434f4d ’.

Ayrıca, Uygulama günlüğünde aşağıdakine benzer bir olay iletisi kaydedilebilir:

Olay türü: hata
Olay kaynağı: .NET 2.0 çalışma zamanı hata raporlaması
Olay kategorisi: yok
Olay KIMLIĞI: 5000
Tarihi: 9/28/2005
Süre: 18: 02 15:
Kullanı.: Yok
Bilgisayar: IIS SERVER
Açıklama:
EventType clr20r3, w3wp.exe. P1, P2 6.0.3790.1830, P3 42435be1 P4 app_web_7437ep-9, P5 0.0.0.0 P6 433b1670, P7 P8 9, a, P9 system.exception, P10 NIL.

Neden

Işlenmeyen özel durum için varsayılan ilke .NET Framework 2.0 değiştiğinden bu sorun oluşur. Varsayılan olarak, işlenmeyen özel durumlar için alt işlemi sona erdirmek için ilkedir.

Microsoft .NET Framework 1.1 ve Microsoft .NET Framework 1.0, yönetilen bir iş parçacığı üzerinde işlenemeyen özel duruma yoksayıldı. Özel durum yakalamak için bir hata ayıklayıcısı ekli olduğu sürece, hiçbir şey yanlış olduğunu bilmeniz değil.

ASP.NET, .NET Framework 2.0 işlenemeyen özel duruma için varsayılan ilke kullanır. Işlenmeyen bir özel durum oluşturuldu, ASP.NET tabanlı uygulama beklenmedik biçimde sonlandırılıyor.

Bu davranış, bir isteğin bağlamında oluşan özel durumlar için geçerli değildir. Bu tür bir özel durum yine de ele ve HttpException nesne tarafından alınmış. Bir isteğin bağlamında oluşan özel durum, alt işlemi sona erdirmek neden olmaz. Ancak, bir Süreölçer iş parçacığı veya bir geri arama işlevini özel durumlar gibi bir isteğin işlenmeyen özel durum bağlamı dışında alt işlemi sona erdirmek neden.

Çözüm

Bu sorunu gidermek için aşağıdaki yöntemlerden birini kullanın.

Yöntem 1

Bu özel durum bilgileri uygulama günlüğüne günlüğe kaydedecektir ıhttpmodule nesne için kaynak kodunu değiştirin. Günlüğe kaydedilen bilgiler aşağıdakileri içerir:
  • Özel durumun oluştuğu sanal dizin yolu
  • Özel durum adı
  • Ileti
  • Yığın izleme
ıhttpmodule nesneyi değiştirmek için <a0></a0>, aşağıdaki adımları izleyin.

Not Bu kod, uygulama günlüğüne hata olay türünü ve <a1>ASP.NET</a1> 2.0.50727.0 olay kaynağı olan bir ileti günlüğe kaydedecektir. Modül sınamak için <a0></a0>, bir ASP.NET sayfasını isteği ThreadPool.QueueUserWorkItem yöntemini işlenmeyen bir özel durum oluşturduğunda başka bir yöntemi çağırmak için kullanır.
  1. Aşağıdaki kod UnhandledExceptionModule.cs adlı dosyaya yerleştirin.
    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 dosyayı aşağıdaki klasöre kaydedin:
    C:\Program Files\Microsoft Visual Studio'nun 8\VC
  3. Microsoft Visual Studio 2005 komut istemini açın.
  4. -K key.snk sn.exe yazın ve ENTER tuşuna basın.
  5. Csc /t:library /r:system.web.dll,system.dll /keyfile:key.snk UnhandledExceptionModule.cs yazın ve ENTER tuşuna basın.
  6. Tür gacutil.exe /if UnhandledExceptionModule.dll, ve sonra ENTER tuşuna basın.
  7. Ngen yüklemek UnhandledExceptionModule.dll yazın ve ENTER tuşuna basın.
  8. Tür gacutil /l UnhandledExceptionModule, ve güçlü UnhandledExceptionModule dosya adını görüntülemek için ENTER tuşuna basın.
  9. 9. Aşağıdaki kod, ASP.NET tabanlı uygulamanızın Web.config dosyasına ekleyin.
    <add name="UnhandledExceptionModule" 
    	type="WebMonitor.UnhandledExceptionModule, <strong name>" />

Yöntem 2

Işlenmeyen özel durum ilkesi geri .NET Framework 1.1 ve .NET Framework 1.0 oluşan varsayılan davranışı değiştirin.

Not Varsayılan davranışı değiştirmek önermiyoruz. Özel durumlar yoksayarsanız, uygulama kaynakları sızdırıyor ve kilitleri iptal.

Bu varsayılan davranışını etkinleştirmek için <a0></a0>, aşağıdaki klasörde bulunan Aspnet.config dosyasına aşağıdaki kodu ekleyin:
%WINDIR%\Microsoft.NET\Framework\v2.0.50727
<configuration>
    <runtime>
        <legacyUnhandledExceptionPolicy enabled="true" />
    </runtime>
</configuration>

Durum

Bu davranış tasarım yüzündendir.

Daha fazla bilgi

.NET Framework'deki değişiklikler hakkında daha fazla bilgi için 2.0, aşağıdaki Microsoft Developer Network (MSDN) Web sitesini ziyaret edin:
http://msdn2.microsoft.com/en-us/netframework/aa570326.aspx (http://msdn2.microsoft.com/en-us/netframework/aa570326.aspx)

Bu makaledeki bilginin uygulandığı durum:
  • Microsoft .NET Framework 2.0
Anahtar Kelimeler: 
kbmt kbtshoot kbfix kbprogramming kbprb KB911816 KbMttr
Otomatik TercümeOtomatik Tercüme
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:911816  (http://support.microsoft.com/kb/911816/en-us/ )