ASP.NET Core でカスタム 404 エラーページを返す
# 以下の記事が書かれた時の版数は .NET Core 3.1 (3.1.201), ASP.NET Core 3.1 (3.1.3) となります.
Visual Studio 2019 の新しいプロジェクトの作成で「ASP.NET Core Web アプリケーション」を選び、ASP.NET Core 3.1 の Web アプリケーション(モデル ビュー コントローラ) を選んで生成されるソースコードだと 404 エラーは、レスポンスボディが無い状態となる. UseStatusCodePagesWithRedirects か UseStatusCodePagesWithReExecute を使うことによってカスタムエラーページを表示することができる.
どちらが良いかだが、
- UseStatusCodePagesWithRedirects だと 302 レスポンスの後に 200 レスポンスが返るので、本来のステータスコードが消えてしまう.
- URL 欄に typo して 404 エラーになったときは、ちょちょっと直せば正しく表示できると思うが、UseStatusCodePagesWithRedirects だと 302 リダイレクトされてしまうので URL が変わってしまい、また最初から書き直しになる.
の2点からして、UseStatusCodePagesWithReExecute の一択だと思う. ということで、Startup.cs に UseStatusCodePagesWithReExecute を追加して、あとは HomeController の Error メソッドをチョチョイっと改造して完成.
WebApplication1/Controllers/HomeController.cs
}[ResponseCache(Duration=0,Location=ResponseCacheLocation.None,NoStore=true)]-publicIActionResultError()+publicIActionResultError(int?id){+if((id??500)==404)+{+returnView("Error404");+}returnView(newErrorViewModel{RequestId=Activity.Current?.Id??HttpContext.TraceIdentifier});}}
WebApplication1/Startup.cs
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.publicvoidConfigure(IApplicationBuilderapp,IWebHostEnvironmentenv){-if(env.IsDevelopment())-{-app.UseDeveloperExceptionPage();-}-else-{-app.UseExceptionHandler("/Home/Error");-// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.-app.UseHsts();-}+app.UseExceptionHandler("/Home/Error");+// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.+app.UseHsts();+app.UseStatusCodePagesWithReExecute("/Home/Error/{0}");+app.UseHttpsRedirection();app.UseStaticFiles();
WebApplication1/Views/Shared/Error404.cshtml
+@{+ViewData["Title"]="Error404";+}++<h1>カスタムError404</h1>+