İşlenmeyen özel durumlar ASP'ye neden olur. .NET Framework beklenmedik bir şekilde çıkmak için NET tabanlı uygulamalar

Bu makale, işlenmeyen özel durumların ASP'ye neden olduğu sorunu çözmenize yardımcı olur. .NET FRAMEWORK beklenmedik bir şekilde çıkmak için NET tabanlı uygulamalar.

Orijinal ürün sürümü: .NET Framework 4.5
Özgün KB numarası: 911816

Not

Bu makale, Microsoft .NET Framework 2.0 ve sonraki tüm sürümler için geçerlidir.

Belirtiler

ASP'de işlenmeyen bir özel durum oluştuğunda. .NET Framework 2.0 ve sonraki sürümleri temel alan NET tabanlı uygulama beklenmedik bir şekilde sonlandırılır. Bu sorun oluştuğunda, sorunu anlamak için ihtiyacınız olan hiçbir özel durum bilgisi uygulama günlüğüne kaydedilmez.

Ancak, aşağıdaki örneğe benzer bir olay iletisi Sistem günlüğüne kaydedilebilir. Ayrıca, aşağıdaki örneğe benzer bir olay iletisi uygulama günlüğüne kaydedilebilir.

Neden

bu sorun, işlenmeyen özel durumlar için varsayılan ilkenin .NET Framework 2.0 ve sonraki sürümlerde değişmesi nedeniyle oluşur. Varsayılan olarak, işlenmeyen özel durumlar için ilke, çalışan işlemini sonlandırmaktır.

.NET Framework 1.1 ve .NET Framework 1.0'da yönetilen iş parçacıklarındaki işlenmeyen özel durumlar yoksayıldı. Özel durumu yakalamak için bir hata ayıklayıcı eklemediğiniz sürece, bir sorun olduğunu fark etmezsiniz.

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

Bu davranış, istek bağlamında oluşan özel durumlar için geçerli değildir. Bu tür özel durumlar hala bir HttpException nesne tarafından işlenir ve sarmalanmıştır. İstek bağlamında oluşan özel durumlar, çalışan işleminin sona ermesi için neden olmaz. Ancak, zamanlayıcı iş parçacığındaki veya geri çağırma işlevindeki özel durumlar gibi istek bağlamı dışında işlenmeyen özel durumlar, çalışan işleminin sona ermesini sağlar.

Çözüm 1

Nesnenin IHttpModule kaynak kodunu, özel durum bilgilerini uygulama günlüğüne kaydedecek şekilde değiştirin. Günlüğe kaydedilen bilgiler aşağıdakileri içerir:

  • Özel durumun oluştuğu sanal dizin yolu
  • Özel durum adı
  • İleti
  • Yığın izlemesi

Nesneyi değiştirmek IHttpModule için aşağıdaki adımları izleyin.

Not

Bu kod, uygulama günlüğünde Hata Olay Türü ve ASP.NET 2.0.50727.0 Olay Kaynağı olan bir iletiyi günlüğe kaydeder. Modülü test etmek için, işlenmeyen bir özel durum oluşturan bir yöntemi çağırmak için yöntemini kullanan ThreadPool.QueueUserWorkItem bir ASP.NET sayfası isteyin.

  1. Aşağıdaki kodu UnhandledExceptionModule.cs adlı 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. UnhandledExceptionModule.cs dosyasını klasöre C:\Program Files\Microsoft Visual Studio 8\VC kaydedin.

  3. Visual Studio Komut İstemi'ni açın.

  4. yazın sn.exe -k key.snkve ENTER tuşuna basın.

  5. yazın csc /t:library /r:system.web.dll,system.dll /keyfile:key.snk UnhandledExceptionModule.csve ENTER tuşuna basın.

  6. yazın gacutil.exe /if UnhandledExceptionModule.dllve ENTER tuşuna basın.

  7. yazın ngen install UnhandledExceptionModule.dllve ENTER tuşuna basın.

  8. yazın gacutil /l UnhandledExceptionModuleve UnhandledExceptionModule dosyasının tanımlayıcı adını görüntülemek için ENTER tuşuna basın.

  9. ASP'nizin Web.config dosyasına aşağıdaki kodu ekleyin. NET tabanlı uygulama.

    <add name="UnhandledExceptionModule"
    type="WebMonitor.UnhandledExceptionModule, <strong name>" />
    

Çözünürlük 2

İşlenmeyen özel durum ilkesini, .NET Framework 1.1'de ve .NET Framework 1.0'da gerçekleşen varsayılan davranışla değiştirin.

Not

Varsayılan davranışı değiştirmenizi önermeyiz. Özel durumları yoksayarsanız uygulama kaynakları sızdırabilir ve kilitleri bırakabilir.

Bu varsayılan davranışı etkinleştirmek için aşağıdaki kodu aşağıdaki klasörde bulunan Aspnet.config dosyasına 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'daki değişiklikler hakkında daha fazla bilgi için .NET Framework 2.0'da Yeni Değişiklikler sayfasını ziyaret edin.