2

グローバル属性でやってみた

編集:最終的な解決策で更新

public class HandleAndLogErrorAttribute : HandleErrorAttribute
{
    private static readonly ILog log = Log<HandleAndLogErrorAttribute>.Create();

    public override void OnException(ExceptionContext filterContext)
    {
        if (!filterContext.ExceptionHandled)
        {
            log.Error("Unhandled exception", filterContext.Exception);
            if (filterContext.HttpContext.Request.IsAjaxRequest())
            {
                filterContext.Result = new { Message = filterContext.Exception.Message, StackTrace = filterContext.Exception.StackTrace }.AsJson();
                filterContext.ExceptionHandled = true;
                filterContext.HttpContext.Response.Clear();
                filterContext.HttpContext.Response.StatusCode = 500;
                filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;      
            }
            else
                base.OnException(filterContext);
        }
    }
}

問題は、MVC が Result を無視してエラー ページをレンダリングすることです。設定filterContext.ExceptionHandled = true;した場合、Result は無視されませんが、500 ではなくコード 200 が返されるため、クライアントの汎用エラー ハンドラはエラーを検出しません。呼び出しの成功メソッドが予期しない動作で起動するため、200 を返すことはできません。

何か案は?

4

0 に答える 0