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

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 911816 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
หมายเหตุบทความนี้นำไปใช้กับ Microsoft .NET Framework 2.0 และรุ่นที่ใหม่กว่าทั้งหมด
ขยายทั้งหมด | ยุบทั้งหมด

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

อาการ

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

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

ชนิดเหตุการณ์: คำเตือน
แหล่งของเหตุการณ์: 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 system.exception a, P9, P10 NIL

สาเหตุ

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

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

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

ลักษณะการทำงานนี้ใช้ไม่ได้กับข้อยกเว้นที่เกิดขึ้นในบริบทของการร้องขอ ข้อยกเว้นต่าง ๆ เหล่านี้ยังคงถูกจัดการ และ โดยHttpExceptionวัตถุที่ถูกห่อ ข้อยกเว้นที่เกิดขึ้นในบริบทของการร้องขอไม่ทำให้เกิดกระบวนการของผู้ปฏิบัติงานที่จะสิ้นสุด อย่างไรก็ตาม ข้อยกเว้นเกิดนอกบริบทของการร้องขอ เช่นข้อยกเว้น ในเธรดตัวจับเวลา หรือ ใน ฟังก์ชันการเรียกกลับ ทำให้กระบวนการของผู้ปฏิบัติงานที่จะสิ้นสุด

การแก้ไข

เมื่อต้องการแก้ไขปัญหานี้ ใช้หนึ่งในวิธีต่อไปนี้

วิธีที่ 1

ปรับเปลี่ยนรหัสแหล่งมาสำหรับออบเจ็กต์IHttpModuleเพื่อที่คุณจะเข้าสู่ข้อยกเว้นข้อมูลบันทึกของโปรแกรมประยุกต์ ข้อมูลที่ถูกบันทึกจะมีดังนี้:
  • เส้นทางไดเรกทอรีเสมือนที่ exceptionoccurred
  • ชื่อข้อยกเว้น
  • ข้อความ
  • การติดตามสแต็ค
เมื่อต้องการปรับเปลี่ยนวัตถุIHttpModuleให้ทำตามขั้นตอนเหล่านี้

หมายเหตุ รหัสนี้จะล็อกข้อความที่มีข้อผิดพลาดเหตุการณ์ชนิดและแหล่งมาของเหตุการณ์ของASP.NET 2.0.50727.0ในบันทึกของโปรแกรมประยุกต์ เมื่อต้องการทดสอบโมดูล ร้องขอเพจที่มี ASP.NET ที่ใช้เมธอดThreadPool.QueueUserWorkItemเพื่อเรียกวิธีการที่ลบส่วนข้อยกเว้นที่ไม่สามารถจัดการได้
  1. ใส่รหัสต่อไปนี้ในแฟ้มที่เป็น 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. บันทึกแฟ้ม UnhandledExceptionModule.cs ไปยัง followingfolder:
    C:\Program Files\Microsoft 8\VC Visual Studio
  3. เปิด CommandPrompt Studio 2005 Microsoft Visual
  4. ชนิด key.snk -k sn.exeและ thenpress ENTER
  5. ชนิด csc /t:library /r:system.web.dll,system.dll/keyfile:key.snk UnhandledExceptionModule.csและ pressENTER แล้ว
  6. ชนิด gacutil.exe /ifUnhandledExceptionModule.dllแล้ว กด ENTER
  7. ชนิด ngen installUnhandledExceptionModule.dllแล้ว กด ENTER
  8. ชนิด gacutil /lUnhandledExceptionModuleแล้ว กด ENTER เพื่อแสดงชื่อแฟ้มUnhandledExceptionModule thestrong
  9. 9. เพิ่มรหัสต่อไปนี้ลงในแฟ้ม Web.config ของโปรแกรมประยุกต์ที่ใช้ yourASP.NET
    <add name="UnhandledExceptionModule" 
    	type="WebMonitor.UnhandledExceptionModule, <strong name>" />

วิธีที่ 2

เปลี่ยนนโยบายข้อยกเว้นที่ไม่สามารถจัดการได้เมื่อต้องการเริ่มต้นการทำงานที่เกิดขึ้น ใน.NET Framework 1.1 และ 1.0 กรอบงาน.NET

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

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

สถานะ

ลักษณะการทำงานนี้เกิดจากการออก

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

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

คุณสมบัติ

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

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

 

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