Как обрабатывать ошибки в моем атрибуте CustomAutorize в приложении asp.net 3.0

Я работаю над приложением asp.net MVC 3.0. Я использую свои собственные CustomRoleProvider и CustomErrorHandler, переопределяя атрибуты по умолчанию.

Все работает нормально. Но проблема в обработке исключений.

При тестировании приложения тестер выдал для тестирования неверное соединение с БД.

В результате пользовательский обработчик ошибок не отображает представление ошибок, а маршрутизирует исходный путь.

Например:

Я запускаю свое приложение как

Home/Index

Сначала он обращается к Custom Role Provider, чтобы получить роли для приложения.

Поскольку соединение с базой данных не является правильным, возникает исключение: «Не удается подключиться».

Теперь вместо маршрутизации в представление ошибок вместе с этим сообщением об ошибке. Это маршрутизация к домашнему контроллеру и действию индекса.

**The code for my Custom Error Handler is as Follows**



public class CustomHandleErrorAttribute : HandleErrorAttribute    // Error handler 
    {
        public override void OnException(ExceptionContext filterContext)
        {
            if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled)
            {
                return;
            }
            if (new HttpException(null, filterContext.Exception).GetHttpCode() != 500)
            {
                return;
            }
            if (!ExceptionType.IsInstanceOfType(filterContext.Exception))
            {
                return;
            }

            // if the request is AJAX return JSON else view.
            if (filterContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
            {
                filterContext.Result = AjaxError(filterContext.Exception.Message, filterContext);
            }
            else
            {
                filterContext.ExceptionHandled = true;
                var controllerName = (string)filterContext.RouteData.Values["controller"];
                var actionName = (string)filterContext.RouteData.Values["action"];
                var model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);

                filterContext.Result = new ViewResult
                {
                    ViewName = View,
                    MasterName = Master,
                    ViewData = new ViewDataDictionary<HandleErrorInfo>(model),
                    TempData = filterContext.Controller.TempData
                };
            }

        }
        protected JsonResult AjaxError(string message, ExceptionContext filterContext)
        {
            if (String.IsNullOrEmpty(message))
                message = "Something went wrong while processing your request. Please refresh the page and try again.";
            filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
            return new JsonResult { Data = new { ErrorMessage = message }, ContentEncoding = System.Text.Encoding.UTF8, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
        }
    }

В приведенном выше коде после настройки filterContext.Result. Это не отображает представление ошибки, как ожидалось.

Пожалуйста, поправьте / предложите мне, где я ошибаюсь ..

Обновлено:

public class CustomRoleProvider: RoleProvider // Пользовательский поставщик ролей {public override string [] GetRolesForUser (string username) {

          // Fetching roles for user from database 
    }

// Некоторые другие методы

} Этот метод генерирует исключение, поскольку пытается подключиться к неправильному соединению.

Обновлено2:

1) Я использую специальный обработчик ошибок для всего контроллера.

2) Мне нужно поймать все исключения, включая ошибки Ajax.

3) Я включил свой код для пользовательского обработчика ошибок выше

4) Я также использую CustomRole Provider для всего контроллера

5) Здесь я пытаюсь создать исключение, указав неправильное соединение с базой данных.

6) Я использую URL: Home / Index

7) Прежде чем перейти к этому URL-адресу, он обращается к методам в классе Role Provider, поскольку я использую его как атрибут

8) Поскольку я указал неправильное соединение с БД, возникает исключение.

9) Затем запускается метод исключения пользовательского обработчика ошибок.

10) Построение модели ошибок для просмотра ошибок

11) Но вот в чем проблема. Вместо рендеринга Error View он будет индексировать метод Home Controller.

12) Но мне нужно, чтобы здесь отображалось окно ошибок, потому что ему не удалось подключиться к базе данных и получить роли. Я хочу, чтобы здесь было остановлено дальнейшее выполнение URL Home / Index.

Надеюсь, это проясняет проблему. Я подбегаю. пожалуйста, не стесняйтесь спрашивать меня о подробностях / разъяснениях


person Sai Avinash    schedule 06.12.2013    source источник
comment
Я хотел бы увидеть больше кода, вызывающего ошибку. Как контроллер, использующий этот атрибут. Почему вы чувствуете необходимость создать свой собственный обработчик ошибок вместо того, чтобы использовать тот, который уже существует? Существует метод OnException, который вы можете переопределить на каждом контроллере или в базовом контроллере, который вы настроили, где вместо этого вы можете иметь дело с Exception.   -  person krillgar    schedule 06.12.2013
comment
@ krillgar .. Я получаю исключение в моем методе Customroleprovider.   -  person Sai Avinash    schedule 06.12.2013
comment
@ krillgar..Обновил мой вопрос..проверьте   -  person Sai Avinash    schedule 06.12.2013
comment
Я предполагаю, что у вас есть атрибут класса контроллера? Мой самый большой вопрос: почему пользователь предоставляет соединение с БД? Почему ваша строка подключения не является частью вашего Web.config файла?   -  person krillgar    schedule 06.12.2013
comment
Я предоставляю подключение к базе данных в самом файле web.config. и да, я использую атрибут для класса контроллера   -  person Sai Avinash    schedule 09.12.2013
comment
У вас есть это в вашем web.config? Это входит в узел system.web: <customErrors mode="On" defaultRedirect="Error"></customErrors>.   -  person krillgar    schedule 09.12.2013
comment
У меня как раз такое: ‹customErrors mode = On› ‹/customErrors›   -  person Sai Avinash    schedule 09.12.2013
comment
Ошибка не происходит в web.config, а скорее в модели, где она подключается к базе данных.   -  person Sai Avinash    schedule 09.12.2013
comment
Поместите defaultRedirect="Error" туда, и это должно помочь избежать перехода на страницу с ошибкой.   -  person krillgar    schedule 09.12.2013
comment
Если мое требование / проблема не были ясны / понятны ... я буду дальше рассказывать   -  person Sai Avinash    schedule 09.12.2013
comment
Большинство вопросов: почему он не перенаправляет на страницу с ошибкой? Это должно быть вашей причиной. Если нет, то в вашем настраиваемом атрибуте есть что-то еще, что вы не настраивали.   -  person krillgar    schedule 09.12.2013
comment
Нет, это не сработало.   -  person Sai Avinash    schedule 09.12.2013
comment
Другая проблема - решить вашу проблему с невозможностью подключиться к базе данных. Вам нужно будет проверить, имеет ли ваш пользователь из вашей строки подключения правильные возможности доступа к указанной вами базе данных. Это также может быть связано с тем, что база данных недоступна из того места, где выполняется ваш код.   -  person krillgar    schedule 09.12.2013
comment
Я использую специальный обработчик ошибок для своего контроллера, который перехватывает это исключение. Я упомянул свой код в вопросе.   -  person Sai Avinash    schedule 09.12.2013
comment
Эта ошибка Коннеквити вызвана мной намеренно, чтобы проверить, правильно ли работает обработка ошибок, это не настоящая проблема.   -  person Sai Avinash    schedule 09.12.2013
comment
Но этот пользовательский обработчик вместо перенаправления на страницу ошибки не выполняет этого, а выполняет действие контроллера.   -  person Sai Avinash    schedule 09.12.2013
comment
Я до сих пор не знаю, как применить фильтр [CustomHandleError]. Вы хотите, чтобы ваше приложение использовало его только на домашнем контроллере или вы хотите использовать его как глобальный фильтр (GlobalFilters.Add(new HandleErrorAttribute());). HandleError предназначен для регистрации нескольких фильтров (например, для разных исключений). Один фильтр может обрабатывать только некоторые конкретные ситуации. Таким образом, в настоящее время применяются и стандартный, и [CustomHandleError] фильтр. Например, вы можете использовать параметр Order (см. здесь), чтобы ваш фильтр работал раньше.   -  person Oleg    schedule 09.12.2013
comment
@ Oleg .. Я использую CustomErrorHandler для всех контроллеров. Есть ли способ узнать, происходит ли запуск после того, как произошла ошибка. Например, получить информацию о последней ошибке   -  person Sai Avinash    schedule 09.12.2013
comment
@Avinash: filterContext.Exception имеет класс Exception и имеет всю информацию об исключении, в котором произошла ошибка. Вы можете изучить filterContext.Exception.InnerException, что может быть интересно, например, в случае SqlException. Вы можете получить ErrorCode по filterContext.Exception.GetType().GetProperty ("ErrorCode"). Это то, о чем вы спрашивали?   -  person Oleg    schedule 09.12.2013
comment
@ Oleg .. я получаю подробную информацию об исключении с помощью filterContext.Exception   -  person Sai Avinash    schedule 09.12.2013
comment
@ Олег .. Не совсем .. это .. что я хочу сказать .. в любой момент времени .. как мы можем узнать .. находится ли приложение в состоянии исключения или в нормальном состоянии /   -  person Sai Avinash    schedule 09.12.2013
comment
@Avinash: Я думаю, что если filterContext.Exception не равно нулю, тогда возникает исключение.   -  person Oleg    schedule 09.12.2013
comment
@ Олег .. Спасибо, Олег .. У меня сработало .. помечаю как ответ.   -  person Sai Avinash    schedule 10.12.2013


Ответы (1)


HandleError предназначен для регистрации нескольких фильтров (например, для разных исключений). Один фильтр может обрабатывать только некоторые конкретные исключения или случаи ошибок, а другие необработанные случаи могут обрабатываться другим HandleError. Я полагаю, что в настоящее время применяются и стандартный, и ваш [CustomHandleError] фильтр. Вы можете установить для свойства Order целочисленное значение, которое задает приоритет от -1 (наивысший приоритет) до любого положительного целочисленного значения. Чем больше целочисленное значение, тем ниже приоритет фильтра. Вы можете использовать Например, параметр Order (см. Здесь), чтобы ваш фильтр работал раньше. Более полное описание заказа вы можете найти в документация MSDN.

Ответ, этот и В статье приведены небольшие примеры использования Order свойства HandleError.

person Oleg    schedule 09.12.2013