All
Я изучаю MVC и использую его для бизнес-приложений (MVC 1.0).
Я действительно изо всех сил пытаюсь разобраться с обработкой исключений. Я провел много времени в Интернете, но не нашел ничего похожего на то, что мне нужно.
В настоящее время мы используем атрибут фильтра, который реализует IExceptionFilter. Мы украшаем базовый класс контроллера этим, чтобы все исключения на стороне сервера были приятно перенаправлены на страницу исключений, которая отображает ошибку и выполняет регистрацию.
Я начал использовать вызовы AJAX, которые возвращают данные JSON, но когда реализация на стороне сервера выдает ошибку, фильтр запускается, но страница не перенаправляется на страницу ошибок - она просто остается на странице, которая вызывает AJAX способ.
Есть ли способ принудительного перенаправления на сервере (например, ASP.NET Server.Transfer или redirect?)
Я читал, что я должен вернуть объект JSON (обернуть исключение .NET) и затем перенаправить на клиента, но тогда я не могу гарантировать, что клиент перенаправит ... но потом (хотя я, вероятно, что-то делаю не так), сервер пытается перенаправить, но затем получает неавторизованное исключение (базовый контроллер защищен, а контроллер исключений - нет, поскольку он не наследуется от этого)
У кого-нибудь есть простой пример (код .NET и jQuery). Я чувствую, что я случайно пробую что-то в надежде, что это сработает
Фильтр исключений до сих пор ...
public class HandleExceptionAttribute : FilterAttribute, IExceptionFilter
{
#region IExceptionFilter Members
public void OnException(ExceptionContext filterContext)
{
if (filterContext.ExceptionHandled)
{
return;
}
filterContext.Controller.TempData[CommonLookup.ExceptionObject] = filterContext.Exception;
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.Result = AjaxException(filterContext.Exception.Message, filterContext);
}
else
{
//Redirect to global handler
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = AvailableControllers.Exception, action = AvailableActions.HandleException }));
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Clear();
}
}
#endregion
private JsonResult AjaxException(string message, ExceptionContext filterContext)
{
if (string.IsNullOrEmpty(message))
{
message = "Server error"; //TODO: Replace with better message
}
filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true; //Needed for IIS7.0
return new JsonResult
{
Data = new { ErrorMessage = message },
ContentEncoding = Encoding.UTF8,
};
}
}