我有一些读取和写入cookie值的asp.net页面。在页面的生命周期中,它可以更新cookie值,然后需要在代码中再次读取它。我发现它是在页面刷新之前没有获得cookie的最新值。有没有解决的办法?这是我用来设置和获取值的代码。
public static string GetValue(SessionKey sessionKey)
{
HttpCookie cookie = HttpContext.Current.Request.Cookies[cookiePrefix];
if (cookie == null)
return string.Empty;
return cookie[sessionKey.SessionKeyName] ?? string.Empty;
}
public static void SetValue(SessionKey sessionKey, string sessionValue)
{
HttpCookie cookie = HttpContext.Current.Request.Cookies[cookiePrefix];
if (cookie == null)
cookie = new HttpCookie(cookiePrefix);
cookie.Values[sessionKey.SessionKeyName] = sessionValue;
cookie.Expires = DateTime.Now.AddHours(1);
HttpContext.Current.Response.Cookies.Set(cookie);
}
答案 0 :(得分:4)
您缺少的是,当您使用SetValue更新cookie时,您正在写入Response.Cookies集合。
当您调用GetValue时,您正在从Request.Cookies集合中读取。
您需要以访问当前信息的方式存储瞬态信息,而不仅仅是直接访问请求cookie。
执行此操作的一种可能方法是编写一个包装类,使用粗糙的伪代码将类似于
public CookieContainer(HttpContext context)
{
_bobValue = context.Request.Cookies["bob"];
}
public Value
{
get { return _bobValue; }
set {
_bobValue = value;
_context.Response.Cookies.Add(new Cookie("bob", value) { Expires = ? });
}
}
本周我遇到了需要做类似代码的问题。 cookie处理模型非常奇怪。
答案 1 :(得分:1)
开始使用会话来存储您的信息,即使它只是暂时的。
Cookie会在页面呈现之前依赖于发送到浏览器的标头。如果您已经向客户端发送了信息,那么继续设置cookie,您将看到您所描述的“页面刷新延迟”。
如果需要具有此值,请在设置cookie和刷新页面之间使用会话变量。但是,即便如此,我也建议在处理步骤中尽早避免设置cookie,并尝试尽早设置它。