Обнаружение истечения срока действия сеанса в ASP.NET MVC

Я построил корзину покупок, которая использует состояние сеанса для хранения данных корзины покупок, пока пользователь просматривает магазин.

У меня проблема: если я оставляю окно браузера открытым на долгое время на шаге 1 корзины покупок, а затем нажимаю «перейти к шагу 2», мои действия вызывают ошибку, поскольку действие шага 2 предполагает, что сеанс не истек, а Объект ShopCart находится в правильном состоянии.

Я бы хотел, чтобы этот сценарий был более приятным для моих пользователей, но я думаю, что мне нужно каким-то образом определить, истек ли сеанс, чтобы при следующем запросе я мог перебросить их на Шаг1.

Я нашел следующий код, который утверждает, что решает проблему, но у меня он не работает.

Условие IsNewSession истинно, но условие

if ((null != sessionCookie) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0)) {
   // handle expired session
}

всегда возвращает false и никогда не обрабатывает недопустимый сеанс. Я смущен.

Возможно ли это в ASP.NET (и MVC)?


person CVertex    schedule 29.09.2009    source источник


Ответы (3)


Способ 1

Поместите этот код в событие Init / Load страницы 2 ...

        if (Context.Session != null)
        {
            if (Context.Session.IsNewSession)
            {
                string sCookieHeader = Request.Headers["Cookie"];
                if ((null != sCookieHeader) && (sCookieHeader.IndexOf("ASP.NET_SessionId") >= 0))
                {

                    if (Request.IsAuthenticated)
                    {
                        FormsAuthentication.SignOut();
                    }
                    Response.Redirect("Error Page");
                }
            }
        }

Способ 2

В качестве альтернативы вы можете проверить, существует ли объект Session, прежде чем продолжить работу с ним на странице 2, например:

if (Session["Key"] != null)
{
   Object O1 = (Object) Session["Key"]; 
}
else
{
    Response.Redirect("ErrorPage.aspx");
}
person The King    schedule 29.09.2009
comment
Что, если пользователь вошел в систему и закроет браузер (пока сеанс еще жив) ... а затем вернется после истечения срока сеанса? - person Paul Zahra; 15.05.2014

Ответ короля мне не подходит. Я добавил FormsAuthentication.SignOut() в OnActionExcuting(). Response.Redirect работать не будет!

if (Request.IsAuthenticated)
{
    FormsAuthentication.SignOut();
}

Это мой полный метод

public class SessionExpireFilterAttribute : ActionFilterAttribute
    {

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            HttpContext ctx = HttpContext.Current;

            // check if session is supported
            if (ctx.Session != null)
            {

                // check if a new session id was generated
                if (ctx.Session.IsNewSession)
                {

                    // If it says it is a new session, but an existing cookie exists, then it must
                    // have timed out
                    string sessionCookie = ctx.Request.Headers["Cookie"];
                    if ((null != sessionCookie) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0))
                    {
                        string redirectOnSuccess = filterContext.HttpContext.Request.Url.PathAndQuery;
                        string redirectUrl = string.Format("?ReturnUrl={0}", redirectOnSuccess);
                        string loginUrl = FormsAuthentication.LoginUrl + redirectUrl;
                        if (ctx.Request.IsAuthenticated)
                        {
                            FormsAuthentication.SignOut();
                        }
                        RedirectResult rr = new RedirectResult(loginUrl);
                        filterContext.Result = rr;
                        //ctx.Response.Redirect("~/Home/Logon");

                    }
                }
            }

            base.OnActionExecuting(filterContext);
        }
    }
person Tom    schedule 06.05.2011
comment
Привет, Том, не обращай внимания на мои знания, но где я должен объявить этот класс (контроллер ???), как я могу использовать эти атрибуты ??? - person Sanjay Zalke; 28.10.2013
comment
Sanjay, объявляй где угодно. Класс создает атрибут. Вы связываете атрибут с вашим классом (ами) контроллера или методом (ами) действия, применяя [SessionExpireFilterAttribute] - person 1c1cle; 15.01.2014

Вам необходимо создать метод Session_OnEnd в файле Global.asax.cs в вашем проекте.

это мой код, и я могу Определение истечения срока действия сеанса в ASP.NET MVC

protected void Session_OnEnd(object sender, EventArgs e)
{
    int userid = 0;
    userid = Convert.ToInt32(Session["UserID"]);
    if (userid != 0)
    {
        var userActivity = DependencyResolver.Current.GetService<IUserRepo>();
        var responce = userActivity.LogOutUsers(userid);
        if (responce == true)
        {
            Session.Clear();
            Session.Abandon();
        }
    }
}

подробнее

person Sandip Kalsariya    schedule 06.03.2020