ASP.NET Core MVC にて、StatusCodePagesMiddlewareを利用する

404ページの表示方法です。

ASP.NET Core MVCでは、コントローラーやアクションが見つからない場合は404 NotFoundのみが返ってくるようになりました。
従来(MVC5)では404と同時にサーバーエラーが表示されていました。

この変更はこれで良いのですが、ブラウザ上にはブランクページが表示されるようになりました。
f:id:mrgchr:20161026204945p:plain

開発者ツールを用いればステータスも分かることではあるのですが、開発時にもある程度分かりやすい表示ができると好ましいです。

というわけでStatusCodePagesMiddlewareを利用して404ページを表示します。

StatusCodePagesMiddlewareを用いる

Startup.csのConfigureメソッドにて、"UseStatusCodePages"を使用すると、400番台から500番台のステータスコードのレスポンス時にページ上に簡易表示がなされます。

f:id:mrgchr:20161026205612p:plain

もちろん、こんな簡素な表示を本番環境で用いるわけにはいかないので、開発環境以外では"UseStatusCodePagesWithRedirects"などを使うようになると思います。
フォーマット文字列の"{0}"にはステータスコードが入ります。

if (env.IsDevelopment())
{
  app.UseDeveloperExceptionPage();
  app.UseBrowserLink();
  app.UseStatusCodePages();
}
else
{
  app.UseExceptionHandler("/Home/Error");
  app.UseStatusCodePagesWithRedirects("~/Error/{0}");
}

そして、別途適当なコントローラーにてハンドリングすればよいです。

[Route("/Error/{code?}")]
public IActionResult Error(int? code = null)
{
  if(code.HasValue && code.Value == 404)
  {
    return View("404");
  }

  return View();
}

リダイレクトされるのが困る場合は、"app.UseStatusCodePagesWithReExecute"などをどうぞ。

オフィシャル情報

公式ドキュメントは下記にて。

Error Handling — ASP.NET documentation

また、UseStatusCodePagesの実装はGitHubにて公開されています。

github.com