我通常不会使用Cookie,但我想查看这个通常使用的Session变量。
如果我设置了Cookie,那么请立即尝试从中读取,我没有得到我刚刚设置的值。
但是,如果我刷新页面或关闭浏览器并将其重新打开,则Cookie似乎已设置。
我正在Chrome中调试此功能。这有什么不同吗?
public const string COOKIE = "CompanyCookie1";
private const int TIMEOUT = 10;
private string Cookie1 {
get {
HttpCookie cookie = Request.Cookies[COOKIE];
if (cookie != null) {
TimeSpan span = (cookie.Expires - DateTime.Now);
if (span.Minutes < TIMEOUT) {
string value = cookie.Value;
if (!String.IsNullOrEmpty(value)) {
string[] split = value.Split('=');
return split[split.Length - 1];
}
return cookie.Value;
}
}
return null;
}
set {
HttpCookie cookie = new HttpCookie(COOKIE);
cookie[COOKIE] = value;
int minutes = String.IsNullOrEmpty(value) ? -1 : TIMEOUT;
cookie.Expires = DateTime.Now.AddMinutes(minutes);
Response.Cookies.Add(cookie);
}
}
以下是我如何使用它:
public Employee ActiveEmployee {
get {
string num = Request.QueryString["num"];
string empNum = String.IsNullOrEmpty(num) ? Cookie1 : num;
return GetActiveEmployee(empNum);
}
set {
Cookie1 = (value != null) ? value.Badge : null;
}
}
这就是我调用它的方式,其中Request.QueryString["num"]
返回 NULL 以便正在读取Cookie1
:
ActiveEmployee = new Employee() { Badge = "000000" };
Console.WriteLine(ActiveEmployee.Badge); // ActiveEmployee is NULL
...但是从Cookie1
读取也会返回null。
我是否需要调用像Commit()这样的命令才能立即获得cookie值?
答案 0 :(得分:6)
Cookie与Session不同 - 有两个 Cookie集合,而不是一个。
Request.Cookies != Response.Cookies
。前者是在浏览器请求页面时从浏览器发送的一组cookie,后者是您使用内容发回的内容。这暴露了cookies RFC的本质,不像Session,它是一个纯粹的Microsoft构造。
答案 1 :(得分:5)
当您在响应中设置Cookie时,它不会被神奇地传输到 request cookies集合中。它在响应中,您可以在那里检查它,但它不会出现在请求对象中,直到它在下一个请求中实际从浏览器发送。
答案 2 :(得分:2)
要添加其他答案,您可以通过在私有变量中缓存值来解决问题,以防cookie尚未更新:
private string _cookie1Value = null;
private string Cookie1 {
get {
if (_cookie1Value == null)
{
// insert current code
_cookie1Value = cookie.Value;
}
return _cookie1Value;
}
set {
// insert current code
_cookie1Value = value;
}
}
答案 3 :(得分:1)
简单地说出来;在响应中设置的cookie仅适用于下一个htpp请求(来自浏览器的下一个get或post操作)。
详细说明:当在HttpResponse中设置cookie值时,只有在响应到达客户端后才会持久存储/存储(意味着浏览器将从Http Response头读取cookie值并保存)。因此,从技术上讲,它仅适用于今后的请求。例如,当用户在浏览器中单击此循环后调用服务器的链接或按钮时。
希望这能给你一些想法,我建议你在使用之前阅读什么是cookies和ASP.NET包装它。