在MVC中,我为Session Timeout创建了自定义属性,如:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class SessionExpireFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
HttpContext ctx = HttpContext.Current;
// If the browser session or authentication session has expired...
if (ctx.Session["USER_ID"] == null )
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary {
{ "Controller", "Employer" },
{ "Action", "SessionTimeout" }
});
}
base.OnActionExecuting(filterContext);
}
}
我的意思是当会话超时时,它应该重定向到“SessionTimeout”Action方法,并且我已经为Controller方法添加了,
[SessionExpireFilter]
public class EmployerController : Controller
{
//Action Methods
}
但是在这里,当Session是Timeout时,它会在浏览器地址上执行动作方法,但它显示如下:
This webpage has a redirect loop
我不知道我哪里出错了?
答案 0 :(得分:4)
您的SessionTimeout
操作导致OnActionExecuting
中的SessionExpireFilter
再次运行,这将成为一个无限循环。你可以:
SessionTimeout
操作放在自己的控制器中,而不使用SessionExpireFilter
属性SessionExpireFilter
属性添加到除SessionTimeout
之外的各个操作,而不是控制器SessionTimeout
代码中的当前操作是否为OnActionExecuting
,并且不执行重定向(不是最好的主意,因为其名称将来可能会发生变化并再次造成麻烦)。