Implémentation de cookie ASP.NET MVC

J’essaie d’implémenter un cookie auxiliaire de base dans mon application. Généralement, je vérifie dans le contrôleur de base à chaque fois si un cookie est défini ou non. Si cookie

public class MyCookie { public static ssortingng CookieName {get;set;} public virtual User User { get; set; } public virtual Application App { get; set; } public MyCookie(Application app) { CookieName = "MyCookie" + app; App = app; } public void SetCookie(User user) { HttpCookie myCookie = HttpContext.Current.Request.Cookies[CookieName] ?? new HttpCookie(CookieName); myCookie.Values["UserId"] = user.UserId.ToSsortingng(); myCookie.Values["LastVisit"] = DateTime.Now.ToSsortingng(); myCookie.Expires = DateTime.Now.AddDays(365); HttpContext.Current.Response.Cookies.Add(myCookie); } public HttpCookie GetCookie() { HttpCookie myCookie = HttpContext.Current.Request.Cookies[CookieName]; if(myCookie != null) { int userId = Convert.ToInt32(myCookie.Values["UserId"]); User user = session.Get(userId); return user; } return null; } } 

Si la session est nulle, j’essaie d’obtenir un cookie ou si l’initialisation de la session, je crée un cookie mais je ne le vois jamais dans le navigateur. Qu’est-ce qui ne va pas?

Je commence toujours la session mais avec userId = 0 Pour obtenir un cookie et définir une session à partir d’un cookie:

 if (userId == 0) { MyCookie myCookie = new MyCookie(_app); User user = cookieHelper.GetCookie(); if (user != null) SessionHelper.SetSession(user); } 

Vous ne pouvez pas définir et obtenir un cookie dans la même demande. Obtenir un cookie le récupère à partir du navigateur et il ne l’a pas encore obtenu – En définissant un cookie, il sera renvoyé dans l’en-tête à la fin de la demande.

Vous devez définir le cookie et faire en sorte que le navigateur redirige peut-être ailleurs (par exemple depuis / login vers / compte), puis lors de la nouvelle demande, le cookie s’affiche correctement.

EDIT: Si cette hypothèse était fausse, je voudrais également savoir où vous appelez réellement .SetCookie (), car nulle part dans le code que vous avez fourni, vous l’appelez réellement pour créer le cookie en premier lieu.

Pour déboguer ces choses, je trouve bon de prendre des morceaux du code que vous supposez devoir fonctionner, testez-les. Par exemple, dans le chargement de page d’une nouvelle page, j’ai entré ceci:

 ssortingng CookieName = "bob"; long UserId = 4; HttpCookie myCookie = HttpContext.Current.Request.Cookies[CookieName] ?? new HttpCookie(CookieName); myCookie.Values["UserId"] = UserId.ToSsortingng(); myCookie.Values["LastVisit"] = DateTime.Now.ToSsortingng(); myCookie.Expires = DateTime.Now.AddDays(365); HttpContext.Current.Response.Cookies.Add(myCookie); 

Et le cookie est apparu correctement sans problème. Donc, sachant que ce code fonctionne réellement, nous pouvons supposer que l’erreur est la fonction non appelée ou le test / débogage que vous êtes en train de faire essaie de définir et de lire le cookie dans la même demande et en échouant

De toute façon bonne chance!

Ma mise en œuvre de travail (version de base)

 public class CookieHelper { public static ssortingng CookieName {get;set;} public virtual Application App { get; set; } public MyCookie(Application app) { CookieName = "MyCookie" + app; } public static void SetCookie(User user, Community community, int cookieExpireDate = 30) { HttpCookie myCookie= new HttpCookie(CookieName); myCookie["UserId"] = user.UserId.ToSsortingng(); myCookie.Expires = DateTime.Now.AddDays(cookieExpireDate); HttpContext.Current.Response.Cookies.Add(myCookie); } } 

si session / cookie a la valeur null (en fait, ID utilisateur = 0)

 if (userId == 0){ CookieHelper myCookie = new Cookie(_app); if (myCookie != null) { userId = Convert.ToInt32(System.Web.HttpContext.Current.Request.Cookies[myCookie.CookieName]["userId"]); if(userId>0) { SessionHelper.SetSession(userId); } } } 

Essaye ça

 HttpCookie cookie = new HttpCookie("Remember_Me"); cookie["userID"] = Userid.ToSsortingng(); cookie.Expires = DateTime.Now.AddMonths(3); Response.Cookies.Add(cookie);