Запрос MVC 3 json должен получать ответ json при исключении

#asp.net-mvc-3 #error-handling

#asp.net-mvc-3 #обработка ошибок

Вопрос:

Я ищу хороший / умный / чистый способ глобальной обработки ошибок, чтобы, если запрос выполнен в формате Json и возникает исключение, результатом должен быть json, а не html.

Ищу либо существующие решения, либо некоторую информацию о том, как создать свое собственное.

Ответ №1:

Один из распространенных способов сделать это — написать пользовательский фильтр исключений:

 public class MyErrorHandlerAttribute : FilterAttribute, IExceptionFilter
{
    public void OnException(ExceptionContext filterContext)
    {
        filterContext.ExceptionHandled = true;
        filterContext.Result = new JsonResult
        {
            Data = new { success = false, error = filterContext.Exception.ToString() },
            JsonRequestBehavior = JsonRequestBehavior.AllowGet
        };
    }
}
  

который может быть зарегистрирован как глобальный фильтр в Global.asax. А затем просто запросить некоторое действие:

 $.getJSON('/someController/someAction', function (result) {
    if (!result.success) {
        alert(result.error);
    } else {
        // handle the success
    }
});
  

Комментарии:

1. Разве это не выполнялось бы для каждого исключения?

2. @Dashu, да для каждого исключения. Вы также могли бы проверить, был ли запрос AJAX-запросом и был ли тип содержимого запроса application / json, и только в этом случае обработать исключение.

3. Интересно, но как вы можете получить свой результат по Ajax.Error событию? Идея, которую вы опубликовали, заключалась в использовании $.getJson , так как бы вы это сделали, используя полный $.ajax, включая error событие?

4. @AdrianoRR, событие ошибки запускается, только если с сервера отправлено значение, отличное от 200.

5. @Darin, я это знаю. Вот почему я спрашиваю, как я могу вернуть данные JsonResult в событие ошибки ajax. Другое дело, если бы он достиг события onException, не выдало бы ли это ошибку, отличную от 200?

Ответ №2:

Вероятно, это выполнимо с помощью пользовательского атрибута… может быть, даже подкласс HandleErrorAttribute . Хитрость будет заключаться в том, как узнать, собиралось ли действие контроллера вернуть JSON или нет. Это может быть так же просто, как добавление суффикса к именам методов, таким как GetCustomerDetailsJson .