ข้อยกเว้นที่จัดการไม่ได้ทำให้โปรแกรมประยุกต์ที่ใช้ ASP.NET ออกจากการทำงานกับ .NET Framework 2.0 โดยไม่คาดคิด

หมายเลขบทความ (Article ID): 911816 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
ขยายทั้งหมด | ยุบทั้งหมด

เนื้อหาบนหน้านี้

อาการ

เมื่อ thrown ข้อยกเว้นเกิดในเว็บไซต์ Microsoft โปรแกรมประยุกต์ที่ใช้ ASP.NET ที่สร้างบน Microsoft .NET Framework 2.0 โดยไม่คาดคิดออกจากแอพลิเคชัน เมื่อปัญหานี้เกิดขึ้น ไม่มีข้อยกเว้น ข้อมูลที่จำเป็นต้องทำความเข้าใจเกี่ยวกับการตัดสินค้าจากคลังมีบันทึกในการ บันทึกของโปรแกรมประยุกต์

อย่างไรก็ตาม ข้อความเหตุการณ์ที่คล้ายกันกับ ต่อไปนี้อาจถูกบันทึกลงในบันทึกของระบบ:

ประเภทอีเวนต์: คำเตือน
แหล่งของเหตุการณ์: W3SVC
ประเภทเหตุการณ์: ไม่มี
รหัสเหตุการณ์: 1009
วัน: 9/28/2005
เวลา: 3:18:11
ผู้ใช้ PM: n/a
คอมพิวเตอร์: เซิร์ฟเวอร์ของ IIS
คำอธิบาย:
การพูลโปรแกรมประยุกต์ติดกระบวนการ 'Defaultapppool หรือไม่' จบการทำงานโดยไม่คาดคิด หมายเลขกระบวนถูก '2548' ที่ รหัสจบการทำงานของกระบวนถูก '0xe0434f4d'

นอกจากนี้ ข้อความเหตุการณ์ นั่นคือคล้ายกับต่อไปนี้อาจถูกบันทึกลงในบันทึกของโปรแกรมประยุกต์:

ชนิดเหตุการณ์: ข้อผิดพลาด
แหล่งของเหตุการณ์: การรันไทม์.NET 2.0 รายงานข้อผิดพลาด
ประเภทเหตุการณ์: ไม่มี
รหัสเหตุการณ์: 5000
วันที่: 9/28/2005
เวลา: 3:18:02 PM
ผู้ใช้: n/a
คอมพิวเตอร์: เซิร์ฟเวอร์ IIS
คำอธิบาย:
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 P9 เป็น system.exception, P10 NIL

สาเหตุ

ปัญหานี้เกิดขึ้นเนื่องจากนโยบายการเริ่มต้นสำหรับการไม่จัดการ ข้อยกเว้นมีการเปลี่ยนแปลงใน.NET Framework 2.0 โดยค่าเริ่มต้น นโยบายสำหรับ ข้อยกเว้นเกิดเป็นจุดสิ้นสุดขั้นตอน

ใน Microsoft ไม่จัดการใน.NET framework 1.1 และ ใน Microsoft .NET Framework 1.0 ข้อยกเว้นบนเธรดที่ได้รับการจัดการถูกละเว้น ยกเว้นว่าคุณได้แนบดีบักเกอร์เมื่อต้องการ การตรวจจับข้อยกเว้น คุณไม่ต้องก็ตระหนักว่า สิ่งใดถูก ไม่ถูกต้อง

ASP.NET ใช้นโยบายเริ่มต้นสำหรับข้อยกเว้นเกิดในการ .NET framework 2.0 เมื่อมีข้อยกเว้นเกิดเป็น thrown ที่ 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 ต่อไปนี้ โฟลเดอร์:
    8\VC Files\Microsoft Visual Studio C:\Program
  3. เปิดคำสั่ง Microsoft Visual Studio ที่ 2005 แสดงกล่องโต้ตอบ
  4. ชนิด key.snk -k sn.exeแล้ว กด ENTER
  5. ชนิด csc /t:library /r:system.web.dll,system.dll /keyfile:key.snk UnhandledExceptionModule.csจากนั้น กด ป้อน
  6. ชนิด ร่วม gacutil.exe 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 และ 1.0 Framework .NET

หมายเหตุ นอกจากนี้เราไม่แนะนำให้ คุณเปลี่ยนลักษณะการทำงานเริ่มต้น ถ้าคุณ ละเว้นข้อยกเว้น แอพลิเคชันอาจมีการรั่วไหลทรัพยากร และ abandon ล็อก

เมื่อต้องการเปิดใช้งานลักษณะการทำงานเริ่มต้นนี้ เพิ่มรหัสต่อไปนี้เมื่อต้องการ แฟ้ม Aspnet.config ที่อยู่ในโฟลเดอร์ต่อไปนี้:
%WINDIR%\Microsoft.NET\Framework\v2.0.50727
<configuration>
    <runtime>
        <legacyUnhandledExceptionPolicy enabled="true" />
    </runtime>
</configuration>

สถานะ

นี้ ลักษณะการทำงาน โดยการออกแบบได้

ข้อมูลเพิ่มเติม

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงใน.NET Framework 2.0 แวะไปที่เว็บไซต์ต่อไปนี้ของ Microsoft สำหรับนักพัฒนาเครือข่าย (MSDN):
http://msdn2.microsoft.com/en-us/netframework/aa570326.aspx

คุณสมบัติ

หมายเลขบทความ (Article ID): 911816 - รีวิวครั้งสุดท้าย: 5 พฤศจิกายน 2555 - Revision: 6.0
ใช้กับ
  • Microsoft .NET Framework 2.0
Keywords: 
kbtshoot kbfix kbprogramming kbprb kbmt KB911816 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:911816

ให้ข้อเสนอแนะ