ASP.Net MVC - как обработать исключение в действии JSON (вернуть информацию об ошибке JSON), но также опубликовать исключение для фильтров? - PullRequest
5 голосов
/ 10 апреля 2009

Я использую фильтр для регистрации исключений, вызванных действиями, который выглядит следующим образом:

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.Exception != null)
        {
           //logger.Error(xxx);
        }
        base.OnActionExecuted(filterContext);
    }

Теперь я хотел бы обработать все мои действия JSON, чтобы вернуть результат JSON с информацией об исключении. Это позволяет Ajax-вызовам определять, была ли какая-либо ошибка на сервере, вместо того, чтобы получать источник страницы ошибок, который бесполезен для Ajax. Я реализовал этот метод для действий JSON в моем AppControllerBase:

    public ActionResult JsonExceptionHandler(Func<object> action)
    {
        try
        {
            var res = action();
            return res == null ? JsonSuccess() : JsonSuccess(res);
        }
        catch(Exception exc)
        {
            return JsonFailure(new {errorMessage = exc.Message});
        }
    }

Это хорошо работает, но, очевидно, оператор catch () не позволяет всем фильтрам обрабатывать исключение, потому что на самом деле исключение не выдается. Есть ли способ оставить исключение доступным для фильтров (filterContext.Exception)?

Ответы [ 2 ]

1 голос
/ 11 апреля 2009

Вы можете сохранить исключение в RequestContext и перехватить его в своем фильтре.

0 голосов
/ 30 апреля 2009

Решение:

действие

    public ActionResult JsonExceptionHandler(Func<object> action)
    {
            try
            {
                    var res = action();
                    return res == null ? JsonSuccess() : JsonSuccess(res);
            }
            catch(Exception exc)
            {
                    controller.ControllerContext.HttpContext.AddError(exc);
                    return JsonFailure(new {errorMessage = exc.Message});
            }
    }

фильтр

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
            var exception = filterContext.Exception ?? filterContext.HttpContext.Error;
            if (exception != null)
            {
               //logger.Error(xxx);
            }

            if (filterContext.Result != null && 
                filterContext.HttpContext.Error != null)
            {
               filterContext.HttpContext.ClearError();
            }

            base.OnActionExecuted(filterContext);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...