يؤدي الاستثناءات غير المعالجة في التطبيقات المستندة إلى ASP.NET لإنهاء بشكل غير متوقع في.NET Framework

ملاحظة: تنطبق هذه المقالة على Microsoft.NET Framework 2.0 والإصدارات الأحدث على الإطلاق.

الأعراض

عندما يتم طرح استثناء غير معالج في Microsoft تطبيق ASP.NET التي تم إنشاؤها في Microsoft.NET Framework 2.0 أو إصدار أحدث، يتم إنهاء التطبيق بشكل غير متوقع. عند حدوث هذه المشكلة، يتم تسجيل أية معلومات استثناء يجب عليك فهم المشكلة في سجل التطبيق.

ومع ذلك، قد يتم تسجيل رسالة حدث مشابه لما يلي في سجل النظام: بالإضافة إلى ذلك، قد يتم تسجيل رسالة حدث مشابه لما يلي في سجل التطبيق:

السبب

تحدث هذه المشكلة لأنه تم تغيير نهج افتراضي للاستثناءات غير المعالجة في.NET Framework 2.0 والإصدارات الأحدث. بشكل افتراضي، نهج للاستثناءات غير المعالجة لإنهاء عملية العامل.

في Microsoft.NET Framework 1.1 وفي Microsoft.NET Framework 1.0، تم تجاهل الاستثناءات غير المعالجة على مؤشرات ترابط مدارة. إلا إذا قمت بإرفاق مصحح أخطاء لالتقاط الاستثناء، قد لا تعرف أي شيء كان خطأ.

يستخدم ASP.NET النهج الافتراضي للاستثناءات غير المعالجة في.NET Framework 2.0 والإصدارات الأحدث. عندما يتم طرح استثناء لم تتم معالجته، تطبيق ASP.NET شكل غير متوقع.

لا ينطبق هذا السلوك للاستثناءات التي تحدث في سياق طلب. لا تزال معالجة هذه الأنواع من الاستثناءات وتغليف بواسطة كائن HttpException . لا تؤدي الاستثناءات التي تحدث في سياق طلب لإنهاء العملية المنفذة. ومع ذلك، الاستثناءات غير المعالجة خارج السياق طلب استثناءات على مؤشر ترابط جهاز ضبط وقت أو في دالة رد اتصال، يؤدي إلى إنهاء عملية العامل.

الحل

لحل هذه المشكلة، استخدم إحدى الطرق التالية.

الطريقة الأولى

تعديل التعليمات البرمجية المصدر للكائن إيهتبمودولي حيث أنه سيقوم بتسجيل معلومات الاستثناء إلى سجل التطبيق. تتضمن المعلومات التي يتم تسجيل ما يلي:
  • مسار الدليل الظاهري حيث حدث الاستثناء
  • اسم الاستثناء
  • الرسالة
  • تتبع مكدس الذاكرة المؤقتة
لتعديل الكائن إيهتبمودولي ، اتبع الخطوات التالية.

ملاحظة: هذا الرمز سيتم تسجيل رسالة تحتوي على نوع حدث خطأ ومصدر الحدث 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 إلى المجلد التالي:
    مايكروسوفت C:\Program 8\VC Visual Studio
  3. افتح موجه الأوامر Microsoft Visual Studio 2005.
  4. اكتب sn.exe ك key.snkومن ثم اضغط ENTER.
  5. اكتب csc/t:library/r:system.web.dll,system.dll/keyfile:key.snk UnhandledExceptionModule.csومن ثم اضغط ENTER.
  6. اكتب gacutil.exe/if UnhandledExceptionModule.dllومن ثم اضغط ENTER.
  7. اكتب ngen تثبيت UnhandledExceptionModule.dllومن ثم اضغط ENTER.
  8. اكتب &/l gacutil أونهاندليديكسسيبتيونمودولي، واضغط على ENTER لعرض الاسم القوى للملف أونهاندليديكسسيبتيونمودولي .
  9. 9-إضافة التعليمات البرمجية التالية إلى ملف Web.config لتطبيق ASP.NET الخاص بك.
    <add name="UnhandledExceptionModule" type="WebMonitor.UnhandledExceptionModule, <strong name>" />

الطريقة الثانية

تغيير نهج استثناء لم تتم معالجته إلى السلوك الافتراضي الذي يحدث في.NET Framework 1.1 وفي.NET Framework 1.0.

ملاحظة: لا نوصي بتغيير السلوك الافتراضي. إذا تجاهلت استثناءات، قد تسرب موارد التطبيق والتخلي عن التأمين.

لتمكين هذا السلوك الافتراضي، أضف التعليمات البرمجية التالية إلى الملف Aspnet.config الموجود في المجلد التالي:
%WINDIR%\Microsoft.NET\Framework\v2.0.50727
<configuration>    <runtime>
<legacyUnhandledExceptionPolicy enabled="true" />
</runtime>
</configuration>

الحالة

يعتبر هذا السلوك حسب التصميم.

مزيد من المعلومات

لمزيد من المعلومات حول التغييرات في.NET Framework 2.0، انتقل إلى موقع شبكة مطوري Microsoft (MSDN) التالي على الويب:
خصائص

رقم الموضوع: 911816 - آخر مراجعة: 15‏/01‏/2017 - المراجعة: 1

تعليقات