نحوه پیاده سازی مدیریت استثناهای گلوبال در ASP.NET

چهارشنبه 3 مهر 1398

مدیریت استثناهای گلوبال در ASP.NET از اهمیت زیادی برخوردار است، در این مطلب قصد داریم درباره مدیریت استثناهای گلوبال در ASP.NET صحبت کنیم.

 نحوه پیاده سازی مدیریت استثناهای گلوبال در ASP.NET

قبل از آن که بخواهیم درباره مدیریت استثناهای گلوبال صحبت کنیم بهتر است بدانید که استثناها در واقع ارور هایی هستند که در زمان اجرای برنامه رخ می دهند و اگر شما نتوانید به خوبی آن ها را مدیریت کنید برنامه شما در زمان اجرا خاتمه پیدا می کند. در این مقاله قصد داریم درباره نحوه پیاده سازی مدیریت استثناهای گلوبال در ASP.NET صحبت خواهیم کرد و در کنار آن سعی می کنیم تمامی مثال ها را در کنار تصاویر مربوط به نمایش نتیجه کدها در اختیار شما قرار دهیم.


دانلود ابزارهای مورد نیاز

برای این که بتوانید با مثال هایی که در این کد وجود دارند کار کنید نیازمند دانلود کردن Visual Studio 2019 و نصب آن بر روی سیستم خود هستید. بنابراین اگر شما نسخه ای از این نرم افزار را بر روی سیستم خود ندارید ابتدا آن را دانلود کرده و نصب کنید و سپس ادامه این مقاله را مطالعه کنید.

 مدیریت استثناهای گلوبال


ساخت یک پروژه ASP.NET در ویژوال استودیو برای مدیریت استثناهای گلوبال

اول از همه اجازه دهید یک پروژه ASP.NET را در ویژوال استودیو 2019 ایجاد کنیم، با فرض این که ویژوال استودیو 2019 بر روی سیستم شما نصب شده است مراحلی که در ادامه برای شما می آوریم را برای ایجاد یک پروژه جدید دنبال کنید:

1-      IDE ویژوال استودیو را باز کنید

2-      بر روی گزینه Create new project کلیک کنید

3-      در پنجره مربوط به Create new project گزینه ASP.Net Core Web Application را از لیستی که برای شما نشان داده می شود انتخاب کنید.

4-      بر روی Next کلیک کنید

5-      در پنجره مربوط به Configure your new project نام پروژه و همین طور محل قرار گیری آن را تعیین کنید.

6-      در صورت تمایل تیک گزینه Place solution and project in the same directory بزنید.

7-      بر روی گزینه Create کلیک کنید

8-      در پنجره Create a New ASP.Net Core Web Application که برای شما نشان داده می شود گزینه .Net Core را به عنوان ران تایم خود انتخاب کنید و از لیستی که به شما نشان داده می شود گزینه  ASP.Net Core 2.2 یا نسخه های بعدی را انتخاب کنید.

9-      گزینه Web Application (Model-View-Controller) را به عنوان قالب خود برای ساخت یک پروژه جدید در ASP.NET انتخاب کنید.

10-  اطمینان حاصل کنید که دو گزینه Enable Docker Support و Configure for HTTPS انتخاب نشوند چرا که ما قصد استفاده از آن ها را نداریم.

11-  مطمئن شوید که گزینه Authentication بر روی مقدار No Authentication تنظیم شده باشد چرا که ما قصد استفاده از آن را نداریم.

12-  بر روی گزینه Create کلیک کنید.

بعد از آن که این مراحل را طی کردید پروژه جدید ASP.Net شما باید در ویژوال استودیو ایجاد شده باشد، ما از این پروژه در بخش های بعدی برای پیاده سازی مدیریت استثناهای گلوبال استفاده خواهیم کرد.

عکس 2

 مدیریت استثناهای گلوبال

گزینه مدیریت استثناهای گلوبال در ASP.NET( بخش اول)

پشتیبانی از مدیریت استثناهای گلوبال در ASP.NET اضافه شده است، شما می توانید از مزایای استفاده از میان افزار مدیریت استثناهای گلوبال بهره مند شوید تا مدیریت استثناها را در یک مکان مرکزی پیکربندی کنید و از این رو کدهای مربوط به مدیریت استثناهای شما که قصد نوشتن آن ها را در اپلیکیشن خود دارید کاهش پیدا می کند.

 مدیریت استثناهای گلوبال


گزینه مدیریت استثناها در ASP.NET( بخش دوم)

رویکرد دوم برای مدیریت استثناهای گلوبال در ASP.Net استفاده از فیلترهای مربوط به استثناها می باشد، شما می توانید با کمی جست و جو اطلاعات زیادی در خصوص فیلترهای استثنا بدست بیاورید. در این مقاله ما از میان افزار مدیریت استثناهای گلوبال استفاده می کنیم و در بخش بعدی نیز در خصوص متد Use Exception Handler بحث خواهیم کرد.

 مدیریت استثناهای گلوبال


استفاده از متد کمکی UseExceptionHandler در ASP.NET

UseExceptionHandler یک متد کمکی است که میان افزار Exception Handler را با یک پیپ لاین پردازش درخواست ها ثبت می کند.

شما می توانید از اینترفیس IExceptionHandlerFeature برای بازگرداندن شی مربوط به استثنا استفاده کنید. قطعه کد زیر به شما نشان می دهد که چگونه از متد Exception Handler برای مدیریت استثناهای گلوبال استفاده کنید.

app.UseExceptionHandler(

            builder =>

            {

                builder.Run(

                async context =>

                {

                     context.Response.StatusCode =

                  (int)HttpStatusCode.InternalServerError;

                    context.Response.ContentType =

                     "application/json";

                    var exception =

                    context.Features.Get

                     <IExceptionHandlerFeature>();

                    if (exception != null)

                    {

                        var error = new ErrorMessage()

                        {

                            Stacktrace =

                             exception.Error.StackTrace,

                            Message = exception.Error.Message

                        };

                        var errObj =

                         JsonConvert.SerializeObject(error);

                        await context.Response.WriteAsync

                         (errObj).ConfigureAwait(false);

                     }

                });

            }

       );

در ادامه نیز می توانید کلاس ErrorMessage را به عنوان مرجع خود مشاهده کنید:

public class ErrorMessage

    {

       public string Message { get; set; }

       public string Stacktrace { get; set; }

    }

 مدیریت استثناهای گلوبال


پیکربندی میان افزار مدیریت استثناهای گلوبال در ASP.NET

زمانی که شما یک پروژه جدید ASP.Net Core MVC می سازید فایل Startup.cs یک متد خواهد داشت که پیکربندی میان افزار مدیریت استثناهای گلوبال را مانند قطعه کد زیر انجام خواهد داد:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)

       {

           if (env.IsDevelopment())

           {

                app.UseDeveloperExceptionPage();

           }

           else

           {

               app.UseExceptionHandler("/Error");

           }

           app.UseStaticFiles();

           app.UseCookiePolicy();

           app.UseMvc(routes =>

           {

               routes.MapRoute(

                   name: "default",

                   template:

                    "{controller=Home}/{action=Index}/{id?}");

           });

       }

توجه داشته باشید که دستور app.UseExceptionHandler("/Error"); در قطعه کد بالا در واقع باعث می شود تا متد UseExceptionHandler میان افزار مدیریت استثناهای گلوبال را ثبت کند و هر زمان که کاربر با یک استثنای مدیریت نشده رو به رو شد به او عبارت خطا را نمایش می دهد.

شما می توانید از مزایای استفاده از متد کمکی UseStatusCodePagesWithReExecute بهره مند شوید تا با کمک آن بتوانید صفحات مربوط به کدهای وضعیت را به پیپ لاین خود اضافه کنید. علاوه بر این شما می توانید از این متد برای مدیریت خطاهای HTTP 404 نیز استفاده کنید. قطعه کد زیر روش پیکربندی به روز رسانی شده را به شما نشان می دهد:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)

   {

           if (env.IsDevelopment())

           {

                app.UseDeveloperExceptionPage();

           }

           else

           {

                app.UseExceptionHandler("/Error");

                app.UseStatusCodePagesWithReExecute("/Error/NotFound/{0}");

           }

     //Other code

   }

 مدیریت استثناهای گلوبال


استفاده از کلاس ErrorController در ASP.Net

توجه داشته باشید که در کلاس HomeController شما می توانید متد اکشن را برای مدیریت خطاها پیدا کنید. ما از این متد اکشن استفاده نمی کنیم بنابراین شما می توانید به راحتی آن را حذف کنید. در این جا یک کلاس ErrorController نیز وجود دارد که شامل یک متد اکشن برای روت مربوط به /Error است.

public class ErrorController : Controller

    {

       [HttpGet("/Error")]

       public IActionResult Index()

       {

           IExceptionHandlerPathFeature

           iExceptionHandlerFeature =

           HttpContext.Features.Get

            <IExceptionHandlerPathFeature>();

           if (iExceptionHandlerFeature != null)

            {

               string path = iExceptionHandlerFeature.Path;

               Exception exception =

               iExceptionHandlerFeature.Error;

               //Write code here to log the exception details

               return View("Error",

               iExceptionHandlerFeature);

           }                

           return View();

       }

        [HttpGet("/Error/NotFound/{statusCode}")]

       public IActionResult NotFound(int statusCode)

       {

           var iStatusCodeReExecuteFeature =  

           HttpContext.Features.Get

            <IStatusCodeReExecuteFeature>();

           return View("NotFound",

            iStatusCodeReExecuteFeature.OriginalPath);

       }

    }

شما می توانید از IExceptionHandlerPathFeature برای باز گرداندن متادیتای مربوط به استثناها استفاده کنید. علاوه بر این شما می توانید از IStatusCodeReExecuteFeature برای باز گرداندن مسیری که خطای HTTP 404 رخ داده است استفاده کنید.

Exception Handler PathFeature و IStatusCodeReExecuteFeature اطمینان حاصل می کنند که پکیج Microsoft.AspNetCore.Diagnostics NuGet در پروژه شما نصب شده باشد. قطعه کد زیر به شما نشان می دهد که چگونه مسیری که خطا در آن اتفاق افتاده است را باز گردانید:

string route = iExceptionHandlerFeature.Path;

برای بازگرداندن جزئیات مربوط به مدیریت استثناهای گلوبال شما می توانید از قطعه کد زیر استفاده کنید:

var exception = HttpContext.Features.Get<IExceptionHandlerPathFeature>();

زمانی که شما route و جزئیات استثنا را باز می گردانید شما می توانید کد مخصوص خود را برای نشان دادن خطاها بنویسید.

 مدیریت استثناهای گلوبال


ساخت ویوها برای نمایش پیغام های خطا در ASP.NET

شما برای نشان دادن پیغام های خطای خود نیازمند یک ویو هستید، در این جا قطعه کدی را برای ساخت این ویو برای شما آورده ایم:

@model Microsoft.AspNetCore.Diagnostics.IExceptionHandlerFeature

@{

    ViewData["Title"] = "Index";

    Layout = "~/Views/Shared/_Layout.cshtml";

}

<div class="row">

    <div class="text-danger">

       <h3>Error: @Model.Error.Message</h3>

    </div>

</div>

<div class="row">

    <div class="col-12">

        <p>@Model.Error.StackTrace</p>

        <p>@Model.Error.InnerException</p>

    </div>

</div>

در این جا قطعه کدی برای صفحه مربوط به Not Found برای شما آورده ایم:

@model string

@{

    ViewData["Title"] = "NotFound";

    Layout = "~/Views/Shared/_Layout.cshtml";

}

    <h1 class="text-danger">

    Error: The requested URL @Model was not found!</h1>

<hr />

حال زمانی که شما اپلیکیشن خود را اجرا می کنید شما باید خروجی زیر را برای مدیریت استثناهای گلوبال و همینطور خطای HTTP 404 به ترتیب مشاهده کنید:

 مدیریت استثناهای گلوبال

در این جا نیز به شما نشان داده می شود که اگر شما اقدام به اجرای یک URL که وجود ندارد کنید خطای HTTP 404 چگونه مدیریت می شود؟

 مدیریت استثناهای گلوبال

پروژه پشتیبانی از مدیریت استثناهای گلوبال در ASP.NET تمام شد. شما می توانید از این پروژه در بسیاری از پروژه های دیگر خود استفاده کنید و از مزایای فوق العاده پیاده سازی آن بهره مند شوید.

ایمان مدائنی

نویسنده 1299 مقاله در برنامه نویسان
  • C#.net
  • 1k بازدید
  • 0 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

تاکنون هیچ کاربری از این پست تشکر نکرده است

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید