J'ai construit un panier d'achat qui utilise l'état de session pour conserver les données du panier d'achat pendant que l'utilisateur parcourt le magasin.
J'ai un problème où si je laisse la fenêtre du navigateur ouverte pendant longtemps à l'étape 1 du panier, puis j'appuie sur "aller à l'étape 2", mes actions génèrent une erreur car l'action de l'étape 2 suppose que la session n'a pas expiré et que L'objet ShopCart est dans le bon état.
Je voudrais que ce scénario soit plus agréable pour mes utilisateurs, mais je pense que je dois en quelque sorte détecter si la session a expiré afin que, à la prochaine demande, je puisse les lancer à l'étape 1.
J'ai trouvé le code suivant qui prétend résoudre le problème, mais cela ne fonctionne pas pour moi.
La condition IsNewSession est vraie mais la condition
if ((null != sessionCookie) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0)) {
// handle expired session
}
renvoie toujours false et ne gère jamais la session invalide. Je suis confus.
Est-ce possible dans ASP.NET (et MVC)?
Mettez ce code dans l'événement Init
/Load
de la page 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");
}
}
}
Alternativement, vous pouvez vérifier si l'objet Session
existe avant de continuer à travailler avec lui dans la page 2, comme ceci:
if (Session["Key"] != null)
{
Object O1 = (Object) Session["Key"];
}
else
{
Response.Redirect("ErrorPage.aspx");
}
La réponse du roi ne fonctionne pas pour moi. J'ai ajouté FormsAuthentication.SignOut()
dans OnActionExcuting()
. Le Response.Redirect
ne fonctionnera pas!
if (Request.IsAuthenticated)
{
FormsAuthentication.SignOut();
}
Ceci est ma méthode complète
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);
}
}
c'est mon code et je suis en mesure de détecter l'expiration de la session sur 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();
}
}
}