Я работаю над приложением 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.
Надеюсь, это проясняет проблему. Я подбегаю. пожалуйста, не стесняйтесь спрашивать меня о подробностях / разъяснениях
Web.config
файла? - person krillgar   schedule 06.12.2013<customErrors mode="On" defaultRedirect="Error"></customErrors>
. - person krillgar   schedule 09.12.2013defaultRedirect="Error"
туда, и это должно помочь избежать перехода на страницу с ошибкой. - person krillgar   schedule 09.12.2013[CustomHandleError]
. Вы хотите, чтобы ваше приложение использовало его только на домашнем контроллере или вы хотите использовать его как глобальный фильтр (GlobalFilters.Add(new HandleErrorAttribute());
).HandleError
предназначен для регистрации нескольких фильтров (например, для разных исключений). Один фильтр может обрабатывать только некоторые конкретные ситуации. Таким образом, в настоящее время применяются и стандартный, и[CustomHandleError]
фильтр. Например, вы можете использовать параметрOrder
(см. здесь), чтобы ваш фильтр работал раньше. - person Oleg   schedule 09.12.2013filterContext.Exception
имеет классException
и имеет всю информацию об исключении, в котором произошла ошибка. Вы можете изучитьfilterContext.Exception.InnerException
, что может быть интересно, например, в случаеSqlException
. Вы можете получитьErrorCode
поfilterContext.Exception.GetType().GetProperty ("ErrorCode")
. Это то, о чем вы спрашивали? - person Oleg   schedule 09.12.2013filterContext.Exception
не равно нулю, тогда возникает исключение. - person Oleg   schedule 09.12.2013