在MVC中,我为会话超时创建了自定义属性,例如:

[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


我不知道我要去哪里错了?

最佳答案

您的SessionTimeout动作导致OnActionExecuting中的SessionExpireFilter重新运行,这将导致无限循环。您可以:


SessionTimeout操作放在没有SessionExpireFilter属性的自己的控制器中
SessionExpireFilter属性置于除SessionTimeout之外的各个动作上,而不是控制器上
检查当前动作是否在您的SessionTimeout代码中为OnActionExecuting,并且不要执行重定向(这不是最好的主意,因为它的名称将来可能会更改并再次引起麻烦)。

08-06 20:05