Перенаправление на определенную страницу после окончания сессии (MVC4)

Проект С# MVC4: я хочу перенаправить на определенную страницу, когда сеанс истекает.

После некоторых исследований я добавил следующий код в Global.asax в моем проекте:

protected void Session_End(object sender, EventArgs e)
{
     Response.Redirect("Home/Index");
}

Когда сеанс истекает, он выдает исключение в строке Response.Redirect("Home/Index");, говоря The response is not available in this context

Что здесь не так?

Ответ 1

Самый простой способ в MVC - это то, что В случае окончания сеанса в каждом действии вы должны проверить его сеанс, а если он равен нулю, перенаправите его на страницу индекса.

С этой целью вы можете создать настраиваемый атрибут, как показано: -

Вот класс, который переопределяет ActionFilterAttribute.

public class SessionExpireAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            HttpContext ctx = HttpContext.Current;
            // check  sessions here
            if( HttpContext.Current.Session["username"] == null ) 
            {
               filterContext.Result = new RedirectResult("~/Home/Index");
               return;
            }
            base.OnActionExecuting(filterContext);
        }
    }

Затем в действии просто добавьте этот атрибут, как показано:

[SessionExpire]
public ActionResult Index()
{
     return Index();
}

Или Просто добавьте атрибут только один раз как:

[SessionExpire]
public class HomeController : Controller
{
  public ActionResult Index()
  {
     return Index();
  }
}

Ответ 2

Это что-то новое в MVC.



    Public class SessionAuthorizeAttribute : AuthorizeAttribute
    {
        Protected override void HandleUnauthorizeRequest( 
                                   AuthorizationContext filtercontext )
            { 
                filtercontext.Result = new RedirectResult("~/Login/Index");
            } 
    }


После примените этот фильтр на вашем контроллере для тех, где вы хотите применить авторизацию.



    [SessionAuthorize]
    public class HomeController : Controller
    {
        // Something awesome here.
    }


Выше SessionAuthorizeAttribute HandleUnAuthorizeRequest функция будет вызываться только после неудачной авторизации вместо неоднократной проверки на авторизацию.

С уважением МК

Ответ 3

создать этот класс фильтра действий

    class SessionExpireAttribute : ActionFilterAttribute {
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.HttpContext.Session["logged"] == null)
        {
            filterContext.Result = new RedirectResult("/Account/Login");
        }
        base.OnActionExecuted(filterContext);
    }

затем используйте его в своем классе или методе, как показано ниже

[SessionExpireAttribute]
public class MyController : Controller
{
    ....
}