مدیریت استثناهای رخ داده در Application_Start یک برنامه‌ی ASP.NET
اگر در برنامه‌ی وب خود از ELMAH استفاده می‌کنید و استثنایی در روال رخدادگردان Application_Start واقع در فایل global.asax.cs رخ دهد، این استثناء در لاگ‌های ELMAH  ظاهر نمی‌شود و صرفا در لاگ‌های خود ویندوز قابل مطالعه خواهد بود؛ از این جهت که HttpContext.Current در این روال هنوز ایجاد نشده‌است. همچنین اگر از IoC Containers استفاده می‌کنید یا آغاز بانک اطلاعاتی ORM خود را در روال Application_Start قرار داده‌اید، تمام این‌ها نیز آغاز نشده باقی خواهند ماند و عملا تا ری استارت بعدی برنامه یا IIS در سرور به صورت دستی، برنامه و سایت قابل استفاده نخواهد بود.

سؤال: آیا می‌توان از ری‌استارت دستی IIS، به ری‌استارت خودکار رسید؟

پاسخ: بلی. فراخوانی متد HttpRuntime.UnloadAppDomain در یک برنامه‌ی ASP.NET سبب ری استارت آن خواهد شد. بنابراین می‌توان این متد را در Application_Start برنامه، جهت ری‌استارت خودکار آن در صورت شکست اولیه Application_Start قرار داد:
void Application_Start(object sender, EventArgs e)
{
   try
   {
      // startup stuff
   }
   catch
   {
     HttpRuntime.UnloadAppDomain(); // سبب ری استارت برنامه و آغاز مجدد آن با درخواست بعدی می‌شود
     throw;
   }
}
اهمیت این مساله از آنجا ناشی می‌شود که ممکن است در آن لحظه‌ی خاص، بار سرور زیاد بوده باشد یا حتی میزان حافظه مهیای جهت آغاز برنامه کافی نبوده باشد؛ و نه الزاما مشکل منطقی در کدهای برنامه. فراخوانی HttpRuntime.UnloadAppDomain سبب خواهد شد تا برنامه شانس مجدد اجرای دیگری را بدون نیازی به ری استارت دستی IIS بیابد.
  • #
    ‫۱۰ سال و ۹ ماه قبل، سه‌شنبه ۲۴ دی ۱۳۹۲، ساعت ۰۴:۰۳
    به هیچ وجه نمی‌توان خطاهای رخ داده در این بخش را catch  کرد؟
    • #
      ‫۱۰ سال و ۹ ماه قبل، سه‌شنبه ۲۴ دی ۱۳۹۲، ساعت ۰۴:۳۶
      چرا، در همین try/catch نوشته شده می‌شود اینکار را انجام داد؛ اما فایده‌ای ندارد چون قسمت آغازین برنامه ناقص است و بعد از آن برنامه قابل استفاده نخواهد بود. مثلا تنظیمات نگاشت‌های IoC Container و یا ORM انجام نشده‌اند. بنابراین catch آن حاصلی نخواهد داشت و عملا برنامه نیاز به ری‌استارت دستی پیدا می‌کند. چون به ظاهر پروسه IIS آن در حال اجرا است، اما قسمت‌های مختلف برنامه پاسخ نمی‌دهند.