Cookie没有快速设置

时间:2012-05-31 20:20:17

标签: c# asp.net cookies httpcookie

我通常不会使用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值?

4 个答案:

答案 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包装它。