ASP.NET MVC филтри за действие: Задаването на filterContext.Result във филтър предотвратява изпълнението на други филтри?

В момента имам 2 филтъра, Auth и Redirect, които правят следното: Filter Auth, който внедрява IAuthorizationFilter и ActionFilter, проверява за влизане и оторизация на потребителя и ако това не успее, задава filterContext.Result да бъде HttpStatusCodeResult от 403 (забранено). Filter Redirect, който внедрява IActionFilter и ActionFilter, проверява резултата и ако е 403, пренасочва към страница за вход.

Прилагам ги към действие, както следва:

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

Въпреки това, Auth се изпълнява, но Redirect никога не се изпълнява (не е един от 4-те заменими метода, които предоставя). Ако премахна Auth Redirect се изпълнява, но ако включа Auth като първи филтър, Redirect не се изпълнява. Предполагам, че настройването на свойството Result на контекста на филтъра предотвратява изпълнението на други филтри, но не мога да осъзная защо това се случва. За информация използвам ASP.NET MVC 3 бета, но това не трябва да променя нищо.

Актуализация: Промяната на типа филтър на Auth на IActionFilter вместо IAuthorizationFilter води до задействане на OnResultExecuting и OnResultExecuted в Redirect, но промяната на Response няма никакъв ефект върху крайния отговор към браузъра.


person Diego    schedule 29.10.2010    source източник


Отговори (2)


В крайна сметка го поправих, като направих Redirect IResultFilter и написах следното в OnResultExecuting:

filterContext.HttpContext.Response.Redirect(url);
person Diego    schedule 29.10.2010

Когато зададете HttpStatusCodeResult, вие задавате пренасочване, така че вторият филтър няма да се изпълни (защото вече сте пренасочили).

person eKek0    schedule 29.10.2010
comment
HttpStatusCodeResult в крайна сметка не е пренасочване, той просто казва на ASP.NET MVC да сервира отговор с указания код на състоянието. - person Diego; 30.10.2010