【问题标题】:Reading a cookie that has just been written causes the cookie to be blanked读取刚刚写入的 cookie 会导致 cookie 为空白
【发布时间】:2013-12-16 01:00:53
【问题描述】:

好的,这个让我难住了。我编写了一个读取 cookie 值的函数。逻辑是

  • 检查 Response.Cookies 以防它刚刚被写入
  • 否则从 Request.Cookies 中读取以获取之前的值

如果 cookie 刚刚被写入,那么一切都很好,我得到了价值。但是,如果 cookie 没有在这次访问中写入 - 它似乎会将已存储 cookie 的值置空。

什么?

这里是代码

注意写入发生在控制器中

public static void PersistCookie(string cookieName, string cookieValue, bool persistent)
{
    var cookie = new HttpCookie(cookieName, cookieValue)
    {
        Path = "/",
        HttpOnly = true,
    };

    if (persistent)
        cookie.Expires = DateTime.Now.AddMonths(6);

    HttpContext.Current.Response.SetCookie(cookie);
}

注意读取发生在局部视图中

public static string ReadCookieValue(string cookieName, bool checkResponseFirst)
{
    if (checkResponseFirst && HttpContext.Current.Response.Cookies[cookieName] != null &&
        HttpContext.Current.Response.Cookies[cookieName].Value.HasValue())
            return HttpContext.Current.Response.Cookies[cookieName].Value;

    return HttpContext.Current.Request.Cookies[cookieName] != null ? HttpContext.Current.Request.Cookies[cookieName].Value : "";
}

似乎仅仅通过检查 cookie 是否有值,它就会把事情搞砸。

想法?

【问题讨论】:

  • 您是从局部视图还是通过 Ajax 调用 ReadCookieValue?
  • 你试过HttpContext.Request.Cookies.Get而不是[]吗?
  • 您可以将代码 sn-p 粘贴到您在响应中设置 cookie 的位置吗?另外,如果你想清除 cookie,这个函数的预期行为是什么?
  • @Andreas - 是的,我确实是从部分角度来称呼它 - 为什么这很重要?
  • @Doug 我现在已经在原始问题中包含了 cookie 的编写

标签: c# .net asp.net-mvc-4 cookies


【解决方案1】:

我不确定您是否可以在部分视图中设置 cookie。使用 Response.SetCookie 设置 cookie 时,信息在 Set-Cookie HTTPHeader 字段中返回给浏览器。我不认为部分视图可以设置此值,请在调用 Response.SetCookie 后尝试使用 Fiddler2 检查您的应用程序响应。

我通常使用纯 Javascript 设置我的 cookie。

【讨论】:

  • 感谢您的更新。我实际上是在控制器中设置 cookie 并尝试在部分视图中读取它 - 所以也许问题毕竟是其他问题。再次澄清一下,当我尝试读取未在该服务器行程中设置的 cookie 时 - 它会清除在上一次行程中设置的 cookie。好困惑....
【解决方案2】:

好吧,在网上搜索了很多之后,一位出色的工作同事提出了以下建议

看来我对 .NET 产生了好奇心。

看看这篇文章

http://www.codeproject.com/Articles/3106/On-The-Care-and-Handling-of-Cookies

如果您尝试访问 Response.Cookies 集合中不存在的 cookie,它将在 Value 中使用空字符串创建,并且过期日期为 01-Jan-0001 00:00。奇怪的是,它还会在 Request.Cookies 集合中创建一个匹配的 cookie,如果不存在的话。

因此,如果您在响应中查看 cookie,那么您将使用空 cookie 间接覆盖客户端计算机上的 cookie,因为浏览器关闭时会过期

所以我的问题解决了(或者应该是无法解决的)。事实证明,我有一个使用 ViewBag 的解决方法,但我很高兴我没有发疯!

感谢您的帮助

【讨论】:

  • 游戏后期,但您可以使用 HttpContext.Current.Response.Cookies.AllKeys.Contains() 首先检查 cookie 是否已设置。
猜你喜欢
  • 2014-06-10
  • 1970-01-01
  • 1970-01-01
  • 2012-05-24
  • 2019-03-13
  • 1970-01-01
  • 2011-06-25
  • 1970-01-01
  • 2014-04-06
相关资源
最近更新 更多