نحوه مدیریت خطای 404 در ASP.NET Core 1.0

چهارشنبه 6 تیر 1397

نسخه‌های قبلی ASP.NET Core 1.0، دارای خطاهای سفارشی برای مدیریت خطا بود. با ASP.NET Core 1.0 و MVC، می‌توانید خطاها را از طریق میان‌افزارها (Middlware) مدیریت کنید. HTTP 404 یکی از خطاهای بسیار رایج است که وقتی سرور نمی‌تواند منابع درخواست شده را پیدا کند رخ می‌دهد. در این مقاله ما شیوه‌های مختلف برای مدیریت خطای HTTP 404 در ASP.NET Core 1.0 و MVC را مشاهده می‌کنیم.

نحوه مدیریت خطای 404 در ASP.NET Core 1.0

نحوه مدیریت خطای 404 در ASP.NET Core 1.0

ما دو راه برای مدیریت خطای 404 پیدا کردیم. درحقیقت با استفاده از این راه‌حل‌ها شما می‌توانید خطاهای کد وضعیت HTTP را مدیریت کنید. برای مدیریت خطا هر دو راه‌حل از متد configure() کلاس Startup.cs استفاده می‌کنند. برای کسانی که با Startup.cs آشنا نیستند،‌ باید بگوییم که این کلاس نقطه ورود برنامه است. و در فایل startup.cs نیز می‌توانید static void main() را که معمولا با برنامه‌های windows/console استفاده می‌کنید پیدا کنید.

حالا بیایید به راه‌حل 1 بازگردیم. در متد configure یک میان‌افزار سفارشی از طریق app.Use تعریف می‌کنیم که برای کد وضعیت در شیء پاسخ بررسی می‌شود. اگر 404 باشد، آن را به Home controller هدایت می‌کند. کد زیر را ببینید.

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    app.UseApplicationInsightsRequestTelemetry();
    app.Use(async (context, next) =>
    {
        await next();
        if (context.Response.StatusCode == 404)
        {
            context.Request.Path = "/Home"; 
            await next();
        }
    });

    app.UseIISPlatformHandler(options => options.AuthenticationDescriptions.Clear());
    app.UseApplicationInsightsExceptionTelemetry();
    app.UseStaticFiles();
    app.UseIdentity();
    // To configure external authentication please see http://go.microsoft.com/fwlink/?LinkID=532715
    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}

راه‌حل 2

راه‌حل دیگر این است که از یک میان‌افزار داخلی StatusCodePagesMiddleware استفاده کنید. این میان‌افزار می‌تواند برای مدیریت کد وضعیت پاسخ بین 400 و 600 مورد استفاده قرار گیرد. این میان‌افزار به شما اجازه می‌دهد تا یک پاسخ خطای عمومی را بازگردانید یا اجازه می‌دهد به هر اکشن کنترلر یا میان‌افزار دیگری هدایت شوید. در کد زیر تمام تغییرات مختلف این میان‌افزار را ببینید.

app.UseStatusCodePages();

// app.UseStatusCodePages(context => context.HttpContext.Response.SendAsync("Handler, status code: " + context.HttpContext.Response.StatusCode, "text/plain"));
// app.UseStatusCodePages("text/plain", "Response, status code: {0}");
// app.UseStatusCodePagesWithRedirects("~/errors/{0}"); // PathBase relative
// app.UseStatusCodePagesWithRedirects("/base/errors/{0}"); // Absolute
// app.UseStatusCodePages(builder => builder.UseWelcomePage());
// app.UseStatusCodePagesWithReExecute("/errors/{0}");

حالا برای مدیریت کد 404، باید از app.UseStatusCodePagesWithReExecute استفاده کنیم که مسیری را که مایل هستید تا به آن بروید را می‌پذیرد.

app.UseStatusCodePagesWithReExecute("/Home/Errors/{0}");

بنابراین ما این مسیر را به Home Controller و اکشن متد Errors هدایت می‌کنیم. {0} چیزی جز خطای کد وضعیت HTTP نیست. در دستور زیر پیاده‌سازی اکشن متد Errors را ببینید.

public IActionResult Errors(string errCode)
{
    ViewData["ErrorID"] = "The following error " + errCode + " occured";
    return View("~/Views/Shared/Error.cshtml");
}

این کد وضعیت را در ViewData اضافه کرده و سپس به shared view ی Error.cshtml باز می‌گرداند. همچنین می‌توانید آن را به صفحه خطای خاصی بر اساس کد خطا بازگردانید.

public IActionResult Errors(string errCode) 
{ 
  if (errCode == "500" | errCode == "404") 
  { 
    return View($"~/Views/Home/Error/{errCode}.cshtml"); 
  }

  return View("~/Views/Shared/Error.cshtml"); 
}

بنابراین اگر کد خطا 500 یا 400 باشد، به Home/Error/500.cshtml یا 404. cshtml باز گردید.

شما باید در بسیاری از وب‌سایت‌ها و انجمن‌ها درباره app.UseErrorPage()، برای مدیریت خطاها، دیده باشید. اما این مورد با انتشار RC1 از ASP.NET Core 1.0 در دسترس نیست. در بتای 5 یا 6 در دسترس بود.

ایمان مدائنی

نویسنده 1299 مقاله در برنامه نویسان

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

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