将多个值附加到 Cookie

Appending multiple values to a Cookie

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

重新加载表单时,cookie 似乎是空的...而且至少有 1 次,集合中似乎有 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;
    }
}

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

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

我不是 c# 中 cookie 的授权专家,所以我担心我可能会遗漏一些东西,但无论如何这是我对这个问题的解释。

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

那么,一种方法是将您的 Get 方法更改为:

public static string Get(string key, HttpRequestBase resp)

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

中也应该可用

如果不是,那么检查您的 Get 中的响应和请求可能是个好主意。

我试图执行这段代码,从我看到你正在尝试创建一个 cookie "HolidayAdmin" 并且这个 cookie 的值被设置为键值对。

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

这段代码现在似乎对我有用。主要区别在于现在使用请求和响应。还有 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;
    }
}