将多个值附加到 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;
}
}
我试图在一个 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;
}
}