.NET Framework uygulamalarının beklenmedik şekilde çıkmasına ASP.NET tabanlı işlenemeyen özel duruma neden

Makale çevirileri Makale çevirileri
Makale numarası: 911816 - Bu makalenin geçerli olduğu ürünleri görün.
NotBu makale, Microsoft .NET Framework 2.0 ve sonraki tüm sürümleri için geçerlidir.
Hepsini aç | Hepsini kapa

Bu Sayfada

Belirtiler

Microsoft .NET Framework 2.0 veya sonraki bir sürümü üzerinde yerleşik ASP.NET tabanlı uygulama Microsoft işlenmeyen bir özel durum yaratıldığında, uygulama beklenmedik biçimde çıkar. Bu sorun oluştuğunda, sorunu anlamak için gereken hiçbir özel durum bilgileri uygulama günlüğüne yazılır.

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
Tarih: 9/28/2005
Süre: 3:18:11
PM Kullanıcı: yok
Bilgisayar: IIS sunucu
Açıklama:
'DefaultAppPool' uygulama havuzuna hizmet veren bir işlem beklenmedik şekilde sona erdirildi. İşlem Kimliği '2548' idi. İşlem çıkış kodu '0xe0434f4d' oldu.

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

Olay Türü: Hata
Olay kaynağı: .NET 2.0 çalışma zamanı hata raporlama
Olay kategorisi: yok
Olay Kimliği: 5000
Tarih: 9/28/2005
Süre: 3:18:02 PM
Kullanıcı: yok
Bilgisayar: IIS sunucu
Açıklama:
Olay türü clr20r3, w3wp.exe P1, 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.

Neden

İşlenmeyen özel durumlar için varsayılan ilke .NET Framework 2.0 ve sonraki sürümlerinde değişmesi nedeniyle bu sorun oluşur. Varsayılan olarak, İş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 iş parçacığı üzerinde işlenemeyen özel duruma göz ardı edildi. Özel durumu yakalamak için bir hata ayıklayıcı ekli değilse, hiçbir şey yanlış fark değil.

ASP.NET, .NET Framework 2.0 ve sonraki sürümlerinde işlenmeyen özel durumlar için varsayılan ilkeyi kullanır. İşlenmeyen bir özel durum olduğunda, ASP.NET tabanlı uygulama beklenmedik biçimde çıkar.

Bu davranış, bir isteğin bağlamında oluşan özel durumları için geçerli değildir. Bu tür özel durumlar hala işlenmiş ve HttpException nesne tarafından kaydırılır. Alt işlemi sona erdirmek bir isteği bağlamında oluşan özel durumları neden olmaz. Ancak, alt işlemi sona erdirmek özel durumlar bir süreölçer iş parçacığı üzerinde veya bir geri arama işlevi gibi bir isteğin bağlamı dışında işlenemeyen özel duruma neden.

Çözüm

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

Yöntem 1

Uygulama günlüğü için özel durum bilgilerini kaydedecek şekilde IHttpModule nesne için kaynak kodunu değiştirin. Günlüğe kaydedilen bilgileri aşağıdakileri içerir:
  • Sanal dizin yolunda exceptionoccurred
  • Kural dışı durum adı
  • İleti
  • Yığın izleme
IHttpModule nesneyi değiştirmek için aşağıdaki adımları izleyin.

Not Bu kod uygulama günlüğüne hata olay türünü ve ASP.NET 2.0.50727.0 olay kaynağı olan ileti günlüğe kaydeder. Modül sınamak için işlenmemiş aykırı bir yöntemi çağırmak için ThreadPool.QueueUserWorkItem yöntemini kullanan bir ASP.NET sayfası isteği.
  1. Aşağıdaki kod, namedUnhandledExceptionModule.cs olan bir 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. Followingfolder UnhandledExceptionModule.cs dosyayı kaydedin:
    C:\Program Files\Microsoft Visual Studio 8\VC
  3. Microsoft Visual Studio 2005 CommandPrompt açın.
  4. Türü sn.exe -k key.snkve ENTER tılayın.
  5. Türü CSC /t:library /r:system.web.dll,system.dll/keyfile:key.snk UnhandledExceptionModule.csve sonra ENTER tuşuna basın.
  6. Türü Gacutil.exe /ifUnhandledExceptionModule.dll, ve sonra ENTER tuşuna basın.
  7. Türü Ngen installUnhandledExceptionModule.dll, ve sonra ENTER tuşuna basın.
  8. Türü Gacutil /lUnhandledExceptionModule, ve thestrong UnhandledExceptionModule dosya adını görüntülemek için ENTER tuşuna basın.
  9. 9. YourASP.NET tabanlı bir uygulamanın Web.config dosyasına aşağıdaki kodu ekleyin.
    <add name="UnhandledExceptionModule" 
    	type="WebMonitor.UnhandledExceptionModule, <strong name>" />

Yöntem 2

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

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

Bu varsayılan davranışı etkinleştirmek için 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ımdan kaynaklanır.

Daha fazla bilgi

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

Özellikler

Makale numarası: 911816 - Last Review: 10 Ekim 2013 Perşembe - Gözden geçirme: 3.0
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft .NET Framework 4.5
  • Microsoft .NET Framework 4.0
  • Microsoft .NET Framework 3.0
  • Microsoft .NET Framework 2.0
Anahtar Kelimeler: 
kbtshoot kbfix kbprogramming kbprb kbmt KB911816 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, Microsoft Makine Çevirisi Düzenleme yazılımı tarafından tercüme edilmiş olup, yüksek olasılıkla profesyonel bir çevirmen yerine CTF teknolojisi kullanılarak, Microsoft Topluluğu tarafından düzenlenmiştir. Microsoft, Bilgi Bankamız içindeki tüm makaleleri kendi dilinizde okuyabilmeniz için size hem profesyonel çevirmenler tarafından tercüme edilen hem de makine tarafından tercüme edildikten sonra Topluluk tarafından kontrol edilen makaleler sunar. Bununla birlikte, makine tarafından tercüme edilen, hatta Topluluk tarafından kontrol edilen bir makale bile her zaman mükemmel dil kalitesinde olmayabilir. Makalede dilinizi konuşan yabancı birisinin yapabileceği türden sözcük, söz dizimi veya dilbilgisi hataları bulunabilir. Microsoft, içeriğin hatalı tercümesinin veya müşterilerimiz tarafından kullanımının doğurabileceği olası yanlış anlamalar, hatalar veya zararlardan sorumlu değildir. Öte yandan Microsoft, Makine Çevirisi Düzenleme işlemini geliştirmek amacıyla Makine Çevirisi Düzenleme yazılımını ve araçlarını sık sık güncelleştirmektedir.
Makalenin İngilizcesi aşağıdaki gibidir: 911816

Geri Bildirim Ver

 

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