ASP.NET CoreMVCで404エラーを処理する方法

ASP.NET Core MVCは、Model-View-Controllerデザインパターンを使用してクロスプラットフォームでスケーラブルな高性能WebアプリケーションとAPIを構築するためのASP.NETMVCフレームワークの.NETCore対応物です。驚いたことに、ASP.NET Coreは404エラーを適切に処理するための多くのオプションを提供しますが、ASP.NET CoreMVCランタイムはデフォルトでそれらを利用しません。

その結果、Webページが見つからず、アプリケーションから404エラーが返された場合、ASP.NET Core MVCは一般的なブラウザーエラーページのみを表示します(下の図1を参照)。この記事では、404エラーをより適切に処理するために使用できるASP.NETCoreの3つのオプションについて説明します。

この記事で提供されているコード例を使用するには、システムにVisual Studio2019がインストールされている必要があります。まだコピーをお持ちでない場合は、こちらからVisual Studio2019をダウンロードできます。

ASP.NET CoreMVCプロジェクトを作成する

まず、VisualStudioでASP.NETCoreプロジェクトを作成しましょう。Visual Studio 2019がシステムにインストールされていると仮定して、以下に概説する手順に従って、VisualStudioで新しいASP.NETCoreプロジェクトを作成します。

  1. Visual StudioIDEを起動します。
  2. 「新しいプロジェクトの作成」をクリックします。
  3. [新しいプロジェクトの作成]ウィンドウで、表示されたテンプレートのリストから[ASP.NET CoreWebアプリケーション]を選択します。
  4. [次へ]をクリックします。 
  5. 次に表示される[新しいプロジェクトの構成]ウィンドウで、新しいプロジェクトの名前と場所を指定します。
  6. [作成]をクリックします。
  7. [新しいASP.NETCore Webアプリケーションの作成]ウィンドウで、ランタイムとして.NET Coreを選択し、上部のドロップダウンリストからASP.NET Core 3.1(またはそれ以降)を選択します。
  8. プロジェクトテンプレートとして「Webアプリケーション(Model-View-Controller)」を選択して、新しいASP.NET CoreMVCアプリケーションを作成します。
  9. ここではこれらの機能を使用しないため、[Dockerサポートを有効にする]チェックボックスと[HTTPS用に構成する]チェックボックスがオフになっていることを確認してください。
  10. 認証も使用しないため、[認証]が[認証なし]に設定されていることを確認してください。
  11. [作成]をクリックします。

これらの手順に従うと、Visual Studio 2019で新しいASP.NETCore MVCプロジェクトが作成されます。このプロジェクトを使用して、この記事の後続のセクションで404エラー処理オプションを説明します。

前のセクションで作成したASP.NETCore MVCプロジェクトを実行すると、下の図1に示すように、アプリケーションのホームページとウェルカムメッセージが表示されます。 

それでは、存在しないWebページを閲覧してみましょう。これを行うには、アプリケーションの実行中にブラウザのアドレスバーに// localhost:6440 / welcomeと入力します。ASP.NET Core MVCエンジンが指定されたURLのリソースを見つけられなかった場合、404エラーが返され、次のエラーページが表示されます。それはあまりエレガントではありませんね。

ASP.NET CoreMVCのResponse.StatusCodeを確認してください

この一般的なエラーページを改善する方法はいくつかあります。簡単な解決策は、応答でHTTPステータスコード404を確認することです。見つかった場合は、コントロールを存在するページにリダイレクトできます。次のコードスニペットは、スタートアップクラスのConfigureメソッドに必要なコードを記述して、404エラーが発生した場合にホームページにリダイレクトする方法を示しています。

 app.Use(async(context、next)=>

    {{

        next();を待つ

        if(context.Response.StatusCode == 404)

        {{

            context.Request.Path = "/ Home";

            next();を待つ

        }

    });

ここで、アプリケーションを実行してURL // localhost:6440 / welcomeを参照しようとすると、アプリケーションのホームページにリダイレクトされます。

参考までに、Configureメソッドの完全なコードを以下に示します。

public void Configure(IApplicationBuilderアプリ、IWebHostEnvironment env)

        {{

            if(env.IsDevelopment())

            {{

                app.UseDeveloperExceptionPage();

            }

            そうしないと

            {{

                app.UseExceptionHandler( "/ Home / Error");

            }

            app.Use(async(context、next)=>

            {{

                next();を待つ

                if(context.Response.StatusCode == 404)

                {{

                    context.Request.Path = "/ Home";

                    next();を待つ

                }

            });

            app.UseStaticFiles();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>

            {{

                endpoints.MapControllerRoute(

                    名前:「デフォルト」、

                    パターン: "{controller = Home} / {action = Index} / {id?}");

            });

        }

ASP.NET CoreMVCでUseStatusCodePagesミドルウェアを使用する

ASP.NET Coreで404エラーを処理するための2番目の解決策は、組み込みのUseStatusCodePagesミドルウェアを使用することです。次のコードスニペットは、StartupクラスのConfigureメソッドにStatusCodePagesを実装する方法を示しています。

public void Configure(IApplicationBuilderアプリ、IWebHostEnvironment env)

        {{

            app.UseStatusCodePages();

            //その他のコード

        }

これで、アプリケーションを実行して存在しないリソースを参照すると、出力は図3のようになります。

ASP.NET CoreMVCでUseStatusCodePagesWithReExecuteミドルウェアを使用する

UseStatusCodePagesWithReExecuteミドルウェアを利用して、応答を生成するプロセスが開始されていない場合に、失敗したステータスコードを処理できます。したがって、このミドルウェアはHTTP 404ステータスコードエラーを処理しません。むしろ、404エラーが発生すると、制御はエラーを処理するために別のコントローラーアクションに渡されます。

次のコードスニペットは、このミドルウェアを使用して別のアクションメソッドにリダイレクトする方法を示しています。

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

アクションメソッドは次のようになります。

[Route( "/ Home / HandleError / {code:int}")]

public IActionResult HandleError(int code)

{{

   ViewData ["ErrorMessage"] = $ "エラーが発生しました。ErrorCodeは次のとおりです:{code}";

   View( "〜/ Views / Shared / HandleError.cshtml");を返します。

}

エラーメッセージを表示するHandleErrorビューを作成するのはあなたに任せます。

最後に、エラーコード専用のビューを作成することをお勧めします。たとえば、Home / Error /500.cshtmlやHome / Error /404.cshtmlなどのビューを作成できます。次に、HTTPエラーコードを確認して、適切なエラーページにリダイレクトできます。

ページが見つからないエラーを処理するさらに別の方法は、カスタムビューを使用し、エラーコードを適切に設定することです。アプリケーションでエラーが発生した場合、ユーザーを適切なエラーページにリダイレクトし、エラーを説明するカスタムエラーメッセージを表示できます。

ASP.NET Coreでさらに多くのことを行う方法:

  • ASP.NET Core3.1のアクションフィルターで依存性注入を使用する方法
  • ASP.NETCoreでオプションパターンを使用する方法
  • ASP.NET Core 3.0MVCでエンドポイントルーティングを使用する方法
  • ASP.NET Core3.0でExcelにデータをエクスポートする方法
  • ASP.NET Core3.0でLoggerMessageを使用する方法
  • ASP.NETCoreで電子メールを送信する方法
  • ASP.NETCoreでSQLServerにデータを記録する方法
  • ASP.NETCoreでQuartz.NETを使用してジョブをスケジュールする方法
  • ASP.NET Core WebAPIからデータを返す方法
  • ASP.NETCoreで応答データをフォーマットする方法
  • RestSharpを使用してASP.NETCore WebAPIを使用する方法
  • Dapperを使用して非同期操作を実行する方法
  • ASP.NETCoreで機能フラグを使用する方法
  • ASP.NETCoreでFromServices属性を使用する方法
  • ASP.NETCoreでCookieを操作する方法
  • ASP.NETCoreで静的ファイルを操作する方法
  • ASP.NETCoreでURL書き換えミドルウェアを使用する方法
  • ASP.NETCoreでレート制限を実装する方法
  • ASP.NETCoreでAzureApplicationInsightsを使用する方法
  • ASP.NETCoreで高度なNLog機能を使用する
  • ASP.NET WebAPIでエラーを処理する方法
  • ASP.NET CoreMVCでグローバル例外処理を実装する方法
  • ASP.NET CoreMVCでnull値を処理する方法
  • ASP.NET Core WebAPIの高度なバージョン管理
  • ASP.NETCoreでワーカーサービスを操作する方法
  • ASP.NETCoreでDataProtectionAPIを使用する方法
  • ASP.NETCoreで条件付きミドルウェアを使用する方法
  • ASP.NETCoreでセッション状態を操作する方法
  • ASP.NETCoreで効率的なコントローラーを作成する方法