【问题标题】:Access cookies immediately without causing duplication立即访问 cookie 而不会导致重复
【发布时间】:2017-09-24 17:27:26
【问题描述】:

基本上,我正在尝试从 cookie 中获取字符串值..

如果我只是从请求中读取它.. 我可以得到很好的价值。 除了第一个页面加载,因为响应没有到达客户端并返回,所以请求没有我刚刚设置的值。

但是,奇怪的是..如果我访问 Response 并检查它是否存在(也就是刚刚设置的值).. 我可以得到这个值。但这会导致一些奇怪的错误(?),即 cookie 在下一次返回的请求中重复。

在第二个请求返回时,该值是从空白的重复请求 cookie 中读取的。 (又名,cookie 值不起作用)

保存

var request = url.RequestContext.HttpContext.Request;
var response = url.RequestContext.HttpContext.Response;

//STORE VALUES TO COOKIE
HttpCookie hc = new HttpCookie("myCookie");
hc.Expires = DateTime.Now.AddDays(1);
hc.Value = "MYVALUE";

request.Cookies.Add(hc);
response.Cookies.Add(hc);

阅读

public static string GetAdvancedCookieValue(this UrlHelper url, string cookieName)
{
    var request = url.RequestContext.HttpContext.Request;
    var response = url.RequestContext.HttpContext.Response;

    // Accessing Response allows me to get value just set.. but leads to duplicate cookies (with blank data -causing blank return later)
    if (response.Cookies[cookieName] != null && String.IsNullOrWhiteSpace(response.Cookies[cookieName].Value) == false)
        return response.Cookies[cookieName].Value;
    if (request.Cookies[cookieName] != null && String.IsNullOrWhiteSpace(request.Cookies[cookieName].Value) == false)
        return request.Cookies[cookieName].Value;

    return null;
 }

【问题讨论】:

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


    【解决方案1】:

    在您的 Save 方法中,您应该检查具有该名称的 cookie 是否已在集合中。

    类似这样的:

    var cookie = response.Cookies[hc.Name];
    if (cookie == null) {
        response.Cookies.Add(hc);
    } 
    else
    {
        cookie.Value = hc.Value;
        cookie.Expires = hc.Expires;
    }
    

    请记住,Request.Cookies 集合中的所有 cookie 都将复制到 Response.Cookies 集合中。如果您在添加 cookie 之前不检查它的存在,您最终会得到两个同名的 cookie。

    【讨论】:

    • 在我添加一个之前,响应中的 cookie 不存在。我认为添加到响应应该覆盖具有该名称的现有响应?我找到了解决方法,但不确定它是否理想。
    • 我还是尝试了这段代码,以防我错过了一些东西并且它不起作用:(感谢帮助!
    【解决方案2】:

    无论出于何种原因,执行 null 检查 response.Cookies[cookieName] != null 似乎会创建 cookie...所以我添加了一个检查,如果值为 null,则将其删除。以免向客户端发布空白 cookie 替换。

    我现在可以访问最新的值,包括最近添加到响应中的值,而不会清除 cookie 值。

        public static string GetAdvancedCookieValue(UrlHelper url, string cookieName)
        {
            var request = url.RequestContext.HttpContext.Request;
            var response = url.RequestContext.HttpContext.Response;
    
            if (response.Cookies[cookieName] != null)
            {
                if (response.Cookies[cookieName].Value == null)
                    response.Cookies.Remove(cookieName);
                else
                    return response.Cookies[cookieName].Value;
            }
    
            if (request.Cookies[cookieName] != null && String.IsNullOrWhiteSpace(request.Cookies[cookieName].Value) == false)
                return request.Cookies[cookieName].Value;
    
            return null;
        }
    

    【讨论】:

      【解决方案3】:

      对于这两个 cookie 集合,检查 cookie 是否存在的方法是根据 cookie 集合的 AllKeys 属性检查名称。

      【讨论】:

      • 我应该添加不使用add来添加cookie使用集。如果 cookie 存在,它将被覆盖,如果它不存在,它将被添加。 add 方法只是添加 cookie,因此允许重复。
      猜你喜欢
      • 2013-12-27
      • 2016-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多