立即访问cookie而不会导致重复

时间:2015-09-23 10:18:22

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

基本上,我试图从cookie中获取字符串值。

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

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

在第二个请求返回..而是从空白的重复请求cookie中读取值。 (aka,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);

READ

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;
 }

3 个答案:

答案 0 :(得分: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。

答案 1 :(得分:1)

出于任何原因,执行空检查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;
    }

答案 2 :(得分:-1)

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