c# - ASP.NET MVC Cookie Implementación
asp.net-mvc httpcookie (3)
Intento implementar un auxiliar de cookies básico en mi aplicación. Principalmente verifico en el controlador base cada vez si hay o no cookies establecidas. Si galleta
public class MyCookie
{
public static string 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.ToString();
myCookie.Values["LastVisit"] = DateTime.Now.ToString();
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<User>(userId);
return user;
}
return null;
}
}
si la sesión es nula, trato de obtener una cookie o si la sesión se inicializa, configuro una cookie pero nunca veo mi cookie en el navegador. ¿Qué está mal?
Siempre comienzo la sesión pero con userId = 0 Para obtener una cookie y configurar una sesión a partir de una cookie:
if (userId == 0)
{
MyCookie myCookie = new MyCookie(_app);
User user = cookieHelper.GetCookie();
if (user != null)
SessionHelper.SetSession(user);
}
Mi implementación de trabajo (versión básica)
public class CookieHelper
{
public static string 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.ToString();
myCookie.Expires = DateTime.Now.AddDays(cookieExpireDate);
HttpContext.Current.Response.Cookies.Add(myCookie);
}
}
si la sesión / cookie es nula (en realidad ID de usuario = 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);
}
}
}
No se puede configurar y obtener una cookie en la misma solicitud. Obtener una cookie lo obtiene del navegador y aún no lo ha recibido: la configuración de una cookie lo prepara para ser enviado como parte del encabezado cuando la solicitud se ha completado.
Debe configurar la cookie y hacer que el navegador redireccione quizás a otra parte (por ejemplo, desde / login a / account) y luego, al leer la nueva solicitud, se mostrará la cookie correctamente.
EDITAR: En caso de que la suposición fuera incorrecta, también me preguntaría dónde está llamando .SetCookie (), ya que en ninguna parte del código que proporcionó, en realidad lo está llamando para crear la cookie.
Para depurar estas cosas, me parece bien tomar fragmentos del código que asumes que debería funcionar, pruébalos. Por ejemplo, en la página de carga de una nueva página, ingresé esto:
string CookieName = "bob";
long UserId = 4;
HttpCookie myCookie = HttpContext.Current.Request.Cookies[CookieName] ?? new HttpCookie(CookieName);
myCookie.Values["UserId"] = UserId.ToString();
myCookie.Values["LastVisit"] = DateTime.Now.ToString();
myCookie.Expires = DateTime.Now.AddDays(365);
HttpContext.Current.Response.Cookies.Add(myCookie);
Y la cookie apareció correctamente sin problema. Entonces, sabiendo que este código realmente funciona, podemos asumir que el error es la función a la que no se llama o que la prueba / depuración que está realizando actualmente está tratando de configurar y leer la cookie en la misma solicitud y está fallando (como dije originalmente)
De cualquier manera buena suerte!
Prueba esto
HttpCookie cookie = new HttpCookie("Remember_Me");
cookie["userID"] = Userid.ToString();
cookie.Expires = DateTime.Now.AddMonths(3);
Response.Cookies.Add(cookie);