اگر در برنامهی وب خود از ELMAH استفاده میکنید و استثنایی در روال رخدادگردان Application_Start واقع در فایل global.asax.cs رخ دهد، این استثناء در لاگهای ELMAH ظاهر نمیشود و صرفا در لاگهای خود ویندوز قابل مطالعه خواهد بود؛ از این جهت که HttpContext.Current در این روال هنوز ایجاد نشدهاست. همچنین اگر از IoC Containers استفاده میکنید یا آغاز بانک اطلاعاتی ORM خود را در روال Application_Start قرار دادهاید، تمام اینها نیز آغاز نشده باقی خواهند ماند و عملا تا ری استارت بعدی برنامه یا IIS در سرور به صورت دستی، برنامه و سایت قابل استفاده نخواهد بود.
سؤال: آیا میتوان از ریاستارت دستی IIS، به ریاستارت خودکار رسید؟
پاسخ: بلی. فراخوانی متد HttpRuntime.UnloadAppDomain در یک برنامهی ASP.NET سبب ری استارت آن خواهد شد. بنابراین میتوان این متد را در Application_Start برنامه، جهت ریاستارت خودکار آن در صورت شکست اولیه Application_Start قرار داد:
اهمیت این مساله از آنجا ناشی میشود که ممکن است در آن لحظهی خاص، بار سرور زیاد بوده باشد یا حتی میزان حافظه مهیای جهت آغاز برنامه کافی نبوده باشد؛ و نه الزاما مشکل منطقی در کدهای برنامه. فراخوانی HttpRuntime.UnloadAppDomain سبب خواهد شد تا برنامه شانس مجدد اجرای دیگری را بدون نیازی به ری استارت دستی IIS بیابد.
سؤال: آیا میتوان از ریاستارت دستی IIS، به ریاستارت خودکار رسید؟
پاسخ: بلی. فراخوانی متد HttpRuntime.UnloadAppDomain در یک برنامهی ASP.NET سبب ری استارت آن خواهد شد. بنابراین میتوان این متد را در Application_Start برنامه، جهت ریاستارت خودکار آن در صورت شکست اولیه Application_Start قرار داد:
void Application_Start(object sender, EventArgs e) { try { // startup stuff } catch { HttpRuntime.UnloadAppDomain(); // سبب ری استارت برنامه و آغاز مجدد آن با درخواست بعدی میشود throw; } }