将多个值附加到Cookie

时间:2015-06-01 06:29:07

标签: c# cookies

我试图在一个cookie中存储一些值,而不是创建大量的cookie。我有一个函数来获取命名值并设置给定名称的值。

当重新加载表单时,cookie似乎是空的......并且至少有一次在集合中似乎有2个具有相同名称的cookie。

代码如下,任何人都可以看到我做错了吗?

澄清有一个cookie,它应该存储几个值,这些值将使用类似于下面的代码

调用
        CookieValues.Set("Test", "TheTestValue", resp);
        CookieValues.Set("Name", "Nick", resp);
        CookieValues.Set("Sex", "male", resp);
        var x = CookieValues.Get("Test", resp);    


public static class CookieValues
{

    public static void Set(string key, string value, HttpResponseBase resp)
    {
        HttpCookie cookie = GetCookie(resp);

        cookie[key] = value;
        cookie.Expires = DateTime.Now.AddYears(1);
        resp.Cookies.Add(cookie);
    }

    public static string Get(string key, HttpResponseBase resp)
    {
        HttpCookie cookie = GetCookie(resp);

        if (cookie[key] != null)
        {
            return cookie[key];
        }

        return "";
    }

    private static HttpCookie GetCookie(HttpResponseBase resp)
    {
        HttpCookie cookie = resp.Cookies["HolidayAdmin"];
        if (cookie == null)
        {
            cookie = new HttpCookie("HolidayAdmin");
        }
        return cookie;
    }
}

4 个答案:

答案 0 :(得分:1)

问题在于在Set方法中继续将Cookie添加到响应中:

resp.Cookies.Add(cookie);

如果您现在创建三个cookie值,那么您有三个cookie,因为您将它们添加三次。

我建议调整GetCookie(HttpResponse)方法以添加Cookie。您可以从Set删除来电。

private static HttpCookie GetCookie(HttpResponseBase resp)
{
    HttpCookie cookie = resp.Cookies["HolidayAdmin"];
    if (cookie == null)
    {
        cookie = new HttpCookie("HolidayAdmin");
        resp.Cookies.Add(cookie);
    }
    return cookie;
}

答案 1 :(得分:1)

我不是c#中的授权大师,所以我担心我可能会遗漏一些东西,但这是我对这个问题的解释。

您正在从响应中添加和获取Cookie 。因此,它们应该在创建后立即可用(在同一响应中)。但是,一旦响应消失,并且cookie实际上已在客户端上设置,您必须使用 request (或者我相信)来获取它。

然而,一种方法是将Get方法更改为:

public static string Get(string key, HttpRequestBase resp)

显然,以这种方式发送请求。这应该意味着您只能在客户端上实际设置cookie之后才请求cookie,即在新请求上。但似乎响应实际上会在创建时将其复制到请求中,因此即使在当前的响应中它也应该可用。

如果不是,则可能需要检查Get中的回复和请求。

答案 2 :(得分:0)

我尝试执行此代码,从我看到您尝试创建Cookie“HolidayAdmin”并将此Cookie的值设置为键值对。

"HolidayAdmin" -- Test=ThetestValue&name=nick&Sex=male

答案 3 :(得分:0)

这段代码现在似乎对我有用。主要区别在于现在使用请求和响应。还有cookie被保留的地方

public static class CookieValues
{
    public static void test(HttpResponseBase resp, HttpRequestBase request, HttpResponseBase response)
    {
        Set("Test", "123", request, response);
        Set("Name", "Nick", request, response);
        Set("Sex", "male", request, response);
        var x = Get("Test", request);
    }


    public static void Set(string key, string value, HttpRequestBase request, HttpResponseBase response)
    {
        HttpCookie cookie = GetCookie(request);

        cookie[key] = value;
        cookie.Expires = DateTime.Now.AddYears(1);
        response.Cookies.Add(cookie);
    }


    public static string Get(string key, HttpRequestBase request)
    {
        HttpCookie cookie = GetCookie(request);

        if (cookie[key] != null)
        {
            return cookie[key];
        }

        return "";
    }

    private static HttpCookie GetCookie(HttpRequestBase request)
    {
        HttpCookie cookie = request.Cookies["HolidayAdmin"];

        if (cookie == null)
        {
            cookie = new HttpCookie("HolidayAdmin");
            request.Cookies.Add(cookie);
        }
        return cookie;
    }
}