【问题标题】:Error: "This webpage has a redirect loop" in asp.net mvc错误:asp.net mvc 中的“此网页有重定向循环”
【发布时间】:2014-09-22 03:05:22
【问题描述】:

在 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 超时时,它会在浏览器地址上执行 action 方法,但显示如下:

 This webpage has a redirect loop

不知道哪里出错了?

【问题讨论】:

  • 检查您在 EmployerController 上的属性
  • 什么意思?属性有问题吗?
  • 也许添加 [AllowAnonymous]?

标签: asp.net-mvc asp.net-mvc-4 session action-filter


【解决方案1】:

您的SessionTimeout 操作会导致SessionExpireFilter 中的OnActionExecuting 再次运行,这将成为一个无限循环。您可以:

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

【讨论】:

  • 我没有为 SessionTimeout Action 方法设置任何循环?
  • @sanjay 不是因为循环,RedirectToRoute 开始一个新的 HTTP 请求,它再次调用过滤器,它再次调用 RedirectToRoute,它再次调用过滤器,不断地:)
  • 谢谢@ssg,很好的解释,我做错了将动作方法放在同一个控制器中,其中包含 SessionTimeout 方法。我已将该 Action 方法放在单独的控制器中,它工作正常。
猜你喜欢
  • 1970-01-01
  • 2012-09-22
  • 2013-01-03
  • 2015-04-09
  • 2020-12-23
  • 1970-01-01
  • 2014-07-08
  • 1970-01-01
相关资源
最近更新 更多