[ASP.net Core] 自訂錯誤頁面

ASP.net Core Custom Error Page

前言

預設ASP.net Core網站如果沒有自訂錯誤頁面的話,一旦部署發行出去,程式出錯Error 500或網頁404 Not Found就會出現如上圖的畫面

本文介紹在ASP.net Core中,如果發生錯誤時,如何出現自訂錯誤畫面,其實滿簡單

實作

※本文版本為ASP.net Core 2.1

準備兩個.html檔放在wwwroot資料夾底下,兩個.html分別取名「404.html」「500.html」

404.html檔案內容↓

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>404 Not Found</title>
</head>
<body>
    <h1>My 404 Not Found</h1>
</body>
</html>

500.html檔案內容↓

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>500 Server</title>
</head>
<body>
    <h1>My 500 Server Error</h1>
</body>
</html>

接著自己找一個Controller寫下當程式發生未捕捉到Exception時要導頁到500.html的動作↓

public class HomeController : Controller
{
  public IActionResult Error()
  {
    return Redirect("~/500.html"); //或http開頭的絕對URL
  }
}

然後以下是本文的重點,在Startup.cs裡寫下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

namespace StarterM
{
    public class Startup
    { 
        public void ConfigureServices(IServiceCollection services)
        { 
            services.AddMvc();
        }
         
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            //為了Demo測試,寫死EnvironmentName為Production
            env.EnvironmentName = EnvironmentName.Production;
            if (env.IsDevelopment())
            {//當env.EnvironmentName為Development,程式出現詳細的錯誤訊息
                app.UseDeveloperExceptionPage(); 
            }
            else
            {//當env.EnvironmentName不是Development時...
                app.UseExceptionHandler("/Home/Error");//未捕捉的Exception程式錯誤,要執行的Controller與Action(必須 / 開頭,否則會發生An error occurred while starting the application)
            }
            //當用戶輸入的網址找不到時↓
            app.UseStatusCodePagesWithRedirects("~/404.html"); //或直接給http開頭的絕對URL

            app.UseStaticFiles();
            app.UseMvcWithDefaultRoute();
        }
    }
}

如此一來,當程式發生例外錯誤沒被try-catch捕捉到時↓

當用戶進入到不存在的網頁時↓

上述的env.EnvironmentName = EnvironmentName.Production;

此行程式碼平常可以拿掉,如果部署到正式機的話,env.EnvironmentName會自動變成Production

不過也有可能想部署到的Server上,它是測試機,專門給公司內部同仁和客戶公開測試用

目前我想得到的解法....那就把env.EnvironmentName指派EnvironmentName.Development;然後再發佈程式,錯誤訊息就會是下面這種詳細的錯誤訊息