Фильтры действий ASP.NET MVC: Установка filterContext.Result в фильтре предотвращает выполнение других фильтров? - PullRequest
3 голосов
/ 30 октября 2010

В настоящее время у меня есть 2 фильтра, Auth и Redirect, которые выполняют следующие действия: Filter Auth, который реализует IAuthorizationFilter и ActionFilter, проверяет логин и авторизацию пользователя, а в случае неудачи устанавливает filterContext.Result равным HttpStatusCodeResult из 403 (запрещено ). Фильтр Redirect, который реализует IActionFilter и ActionFilter, проверяет Результат и, если это 403, перенаправляет на страницу входа.

Я применил их к действию следующим образом:

[Auth(Order=0)]
[Redirect(Order=1)]

Однако Auth выполняется, но Redirect никогда не выполняется (не один из 4 переопределяемых методов, которые он предоставляет). Если я удаляю Auth, Redirect выполняется, но если я включаю Auth в качестве первого фильтра, Redirect не выполняется. Я предполагаю, что установка свойства Result контекста фильтра предотвращает выполнение любых других фильтров, но я не могу понять, почему это происходит. К вашему сведению, я использую ASP.NET MVC 3 beta, но это ничего не должно изменить.

Обновление: изменение типа фильтра Auth на IActionFilter вместо IAuthorizationFilter приводит к срабатыванию OnResultExecuting и OnResultExecuted в Redirect, но изменение отклика там никак не влияет на окончательный ответ браузеру.

Ответы [ 2 ]

2 голосов
/ 30 октября 2010

Я закончил тем, что исправил это, сделав Redirect IResultFilter и написав следующее в OnResultExecuting:

filterContext.HttpContext.Response.Redirect(url);
0 голосов
/ 30 октября 2010

Когда вы устанавливаете HttpStatusCodeResult, вы устанавливаете перенаправление, поэтому второй фильтр не будет работать (потому что вы уже перенаправили).

...