1

asp.net mvc 4 アプリケーションのロギング フレームワークとして Elmah 1.2 を使用しています。

web.config ファイルで、customErrors モードをオンに設定しました。

<customErrors mode="On" defaultRedirect="/Error">
  <error statusCode="404" redirect="/Error/NotFound" />
</customErrors>

カスタムのHandleErrorAttributeも作成し、このリンクからコードをコピーしました。

http://joel.net/logging-errors-with-elmah-in-asp.net-mvc-3--part-4--handleerrorattribute

私の Home コントローラーでは、ロギング フレームワークをテストするために例外をスローするだけです。

    public ActionResult About()
    {
        throw new Exception("this is a buggggggggggggg");

        ViewBag.Message = "Your app description page.";

        return View();
    }

「これはバグググググググググです」がデータベースに記録されています。次に、別のエラーもログに記録されますが、それが起こるとは思っていませんでした。

ビュー「エラー」またはそのマスターが見つからないか、検索された場所をサポートするビュー エンジンがありません。次の場所が検索されました: ~/Views/Home/Error.aspx ~/Views/Home/Error.ascx ~/Views/Shared/Error.aspx ~/Views/Shared/Error.ascx ~/Views/Home/Error. cshtml ~/Views/Home/Error.vbhtml ~/Views/Shared/Error.cshtml ~/Views/Shared/Error.vbhtml

アップデート:

ティムの提案に従うと、別の問題が発生します。

共有フォルダーに Error.cshtml を作成するとします。未処理の例外が発生すると、"/Error" ページではなく、この Error.cshtml ファイルが表示されます。customErrors を有効にしています。それらはすべて「/Error」ページにリダイレクトされます。

4

2 に答える 2

2

ASP.NET MVC 5 RC を使用してアプリケーションを開発しており、エラー ログにも Elmah を使用しています。カスタムエラー処理属性を使用してエラーをカスタムコントローラーのカスタムアクションにリダイレクトしていますが、提供したリンクに示されているものとは異なります。

ただし、同じ問題がありました。Elmah はエラーを適切にログに記録していましたが、「エラー ビューが見つかりません」というエントリも追加していました。属性の OnException メソッドに次の行を追加して、これを解決しました。

filterContext.ExceptionHandled = true;

完全を期すために、これは私が使用しているカスタム エラー処理属性の完全なコードです。

public class CustomHandleErrorAttribute: HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        filterContext.ExceptionHandled = true;

        if(filterContext.HttpContext.Request.IsAjaxRequest()) {
            filterContext.HttpContext.Response.StatusCode = 
                (int)HttpStatusCode.InternalServerError;
            filterContext.Result = new ContentResult() {
                Content = "Server error",
                ContentType = "text/plain"
            };
        }
        else {
            filterContext.Result = new RedirectToRouteResult(
                "Default",
                new System.Web.Routing.RouteValueDictionary(new
                {
                    controller = "Error",
                    action = "ApplicationError"
                }));
        }
    }
}
于 2013-10-07T10:44:52.080 に答える