2

テスト目的で、次の方法があります。

public ActionResult Index()
{
    System.Diagnostics.Debug.Write("Index");
    return new HttpNotFoundResult();
}

メソッドが呼び出されています ('Index' が出力されます)。どういうわけか、それがHttpExceptionスローされる原因になっています。私の Global.asax ファイルには、次のApplication_Error実装があります。

void Application_Error(object sender, EventArgs e)
{
    Exception exc = Server.GetLastError();
    if (exc is System.Web.HttpException)
    {
        string msg = "UrlReferrer: "
            + Context.Request.UrlReferrer + " UserAgent: " + Context.Request.UserAgent
            + " UserHostAddress: " + Context.Request.UserHostAddress + " UserHostName: "
            + Context.Request.UserHostName;

        ErrorHandler.Error(exc.Message, msg);
    }
    else {
        ...
    }
}

このメソッドは、システムが のリクエストを処理した後に呼び出されていますIndexHttpNotFoundResultこれが原因で例外がスローされると思います-またはActionResult、ステータスコードが404の場合に例外がスローされる可能性があります。

OnExceptionコントローラーのハンドラーを回避しているため、これは非常に面倒です。私の Web サイトでApplication_Errorは、最後のフォールバックであると想定されています。ほとんどの通常のエラーは、他の場所 (コントローラーまたはアクション フィルターによって) で処理されることを意図しています。Application_Error完全に予期しない例外、または画像や .js ファイルなどの 404のみをログに記録したい。

プログラムで生成された 404 の例外を asp.net がスローするのを止める方法はありますか? または、プログラムで生成された 404 が原因であるApplication_Errorかどうかを判断する方法はありますか?HttpException

4

1 に答える 1

2

すべてのアクションによって発生した 404 例外を処理するカスタム例外フィルターを作成できます。コレクションを使用HttpContext.Itemsして、プログラムによって発生した 404 であるかどうかを追跡できます。

カスタム例外フィルター

public class NotFoundExceptionFilter : IExceptionFilter
{        
    public void OnException(ExceptionContext filterContext)
    {
        // ignore if the exception is already handled or not a 404
        if (filterContext.ExceptionHandled || new HttpException(null, filterContext.Exception).GetHttpCode() != 404)
            return;

        filterContext.HttpContext.Items.Add("Programmatic404", true);
        filterContext.ExceptionHandled = true;
    }
}

NotFoundExceptionFilterグローバル フィルターとして適用する必要があります。

Application_Error イベント

public static void Application_Error(object sender, EventArgs e)
{
    var httpContext = ((MvcApplication)sender).Context;

    // ignore if it is a programatically raised 404
    if(httpContext.Items["Programmatic404"] != null && bool.Parse(httpContext.Items["Programmatic404"].ToString()))
        return;

    // else, Log the exception
}
于 2012-12-03T14:38:22.603 に答える