2

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

...但读取 fromCookie1也返回 null 。

我需要调用像 Commit() 这样的命令,以便立即使用 cookie 值吗?

4

4 回答 4

6

Cookie 不像 Session - 有两个cookie 集合,而不是一个。

Request.Cookies != Response.Cookies. 前者是浏览器在请求页面时发送的一组 cookie,后者是您随内容返回的内容。这暴露了 cookie RFC 的性质,与 Session 不同,后者是纯粹的 Microsoft 构造。

于 2012-05-31T20:22:35.677 回答
5

当您在响应中设置 cookie 时,它​​不会神奇地传输到请求cookie 集合中。它在响应中,您可以自由地在那里检查它,但它不会出现在请求对象中,直到它实际上是在下一个请求中从浏览器发送的。

于 2012-05-31T20:22:15.803 回答
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;
  }
}
于 2012-05-31T20:25:34.497 回答
1

简单地说;在响应中设置的 cookie 仅可用于下一个 htpp 请求(来自浏览器的下一个 get 或 post 操作)。

详细说明:在 HttpResponse 中设置 cookie 值时,只有在响应到达客户端后才会持久化/存储(意味着浏览器将从 Http Response 标头中读取 cookie 值并保存)。因此,从技术上讲,它仅适用于以后的请求。例如,当用户单击链接或按钮时,在此循环之后从浏览器进行服务器调用。

希望这能给你一些想法,我建议你在使用它之前阅读什么是 cookie 和 ASP.NET 包装它。

于 2012-05-31T20:50:18.137 回答