Перенаправить asp.net mvc, если выброшено исключение - PullRequest
8 голосов
/ 14 января 2010

Мне нужно глобально перенаправить моих пользователей, если в моем приложении появляется пользовательская ошибка. Я попытался вставить некоторую логику в мой файл global.asax для поиска моей пользовательской ошибки и, если она возникла, выполнить перенаправление, но мое приложение никогда не использует мой метод global.asax. Он продолжает выдавать ошибку, в которой говорится, что мое исключение не было обработано кодом пользователя.

вот что у меня есть в моем глобальном.

protected void Application_Error(object sender, EventArgs e)
{
    if (HttpContext.Current != null)
    {
        Exception ex = HttpContext.Current.Server.GetLastError();
        if (ex is MyCustomException)
        {
            // do stuff
        }
    }
}

и мое исключение выдается следующим образом:

if(false)
    throw new MyCustomException("Test from here");

когда я вставляю это в попытку catch из файла, генерирующего исключение, мой метод Application_Error никогда не достигается. У кого-нибудь есть предложения относительно того, как я могу справиться с этим в глобальном масштабе (справиться с моим пользовательским исключением)?

спасибо.

1/15/2010 изменить: Вот что есть в // делать вещи.

RequestContext rc = new RequestContext(filterContext.HttpContext, filterContext.RouteData);
string url = RouteTable.Routes.GetVirtualPath(rc, new RouteValueDictionary(new { Controller = "Home", action = "Index" })).VirtualPath;
filterContext.HttpContext.Response.Redirect(url, true);

Ответы [ 2 ]

10 голосов
/ 15 января 2010

Вы хотите создать клиентский фильтр для ваших контроллеров / действий. Вам нужно будет наследовать от FilterAttribute и IExceptionFilter.

Примерно так:

public class CustomExceptionFilter : FilterAttribute, IExceptionFilter
{
    public void OnException(ExceptionContext filterContext)
    {
        if (filterContext.Exception.GetType() == typeof(MyCustomException))
        {
            //Do stuff
            //You'll probably want to change the 
            //value of 'filterContext.Result'
            filterContext.ExceptionHandled = true;
        }
    }
}

После того, как вы его создали, вы можете применить атрибут к BaseController, от которого наследуются все ваши другие контроллеры, чтобы сделать его функциональным для всего сайта.

Эти две статьи могут помочь:

0 голосов
/ 13 августа 2013

Я нашел этот ответ (и вопрос) полезным Asp.net mvc override OnException в базовом контроллере продолжает распространяться на Application_Error

В вашем случае вам не хватает того, что вам нужно добавить свой собственный фильтр в FilterConfig.cs в папке App_Start:

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new CustomExceptionFilter());
        filters.Add(new HandleErrorAttribute());
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...