web-dev-qa-db-ja.com

ASP.NET MVCでApplication_Errorを使用するにはどうすればよいですか?

MVCプロジェクトでApplication_Errorを使用したいのですが、機能しません。以下をGlobal.asaxファイルに追加します。

    protected void Application_Error(object sender, EventArgs e)
    {
        Exception objErr = Server.GetLastError().GetBaseException();
        Session["Test"] = "Message:" + objErr.Message.ToString();
    }

(セッションはテスト専用です。これを機能させるには、データベースを使用してエラーをログに記録します。)次に、HomeControllerとHome/Index Viewから例外をスローしようとしますが、Debugのみがトリガーされます。

    public ActionResult Index()
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC!";
        throw (new Exception());
        return View();
    }

私のWebconfigファイルでdefaulterrorページを設定しましたが、ビューにリダイレクトされません。

    <customErrors defaultRedirect="Home/Error">
        <error statusCode="403" redirect="NoAccess.htm" />
        <error statusCode="404" redirect="FileNotFound.htm" />
    </customErrors>
17
Poku

したがって、最初に、グローバルエラー処理は最後の手段である必要があり、コントローラークラスにはエラーに対する特定のエラーメソッドがあることを覚えておいてください。

protected virtual bool OnError(string actionName, 
    System.Reflection.MethodInfo methodInfo, Exception exception)

この中で、標準の共有エラービューにリダイレクトできます。

protected override bool OnError(string actionName, 
    System.Reflection.MethodInfo methodInfo, Exception exception)
{
   RenderView("Error", exception);
   return false;
}

グローバルアプリケーションエラーで発生する問題は、ビューまたはコントローラーの概念がないため、そこにリダイレクトする場合は、既知のURLを使用する必要があることです。

protected void Application_Error(object sender, EventArgs e)
{
    Exception exception = Server.GetLastError();
    System.Diagnostics.Debug.WriteLine(exception);
    Response.Redirect("/Home/Error");
}

butこれを行う必要はありません。 web.configでデフォルトのエラーページを設定した場合、そのリダイレクトは必要ありません。

<customErrors defaultRedirect="Home/Error" />

ただし、存在しないホームコントローラーにエラービューを追加していない限り、次のコードをホームコントローラーに追加します。

public ActionResult Error()
{
    return View();
}

次に(賢明な場合は)エラー処理コードをError()メソッドに配置します。これにより、すべての未処理エラーが終了します。

public ActionResult Error()
{
    Exception exception = Server.GetLastError();
    System.Diagnostics.Debug.WriteLine(exception);
    return View();
}

最後に、localhostに接続している場合、デフォルトではカスタムエラーは表示されないことを忘れないでください。したがって、その動作を変更する必要があります

<customErrors mode="On" defaultRedirect="/Home/Error" />
17
blowdart