我正在创建一个访问网站并登录的客户端+自动执行某些任务,但他们最近更新了他们的cookie(无论出于何种原因......)在其标识cookie中包含逗号。
因此,例如,Cookie将具有与此类似的值:
a,bcdefghijklmnop
问题是,根据msdn,你不能在cookie的值中使用逗号或句点。我正在寻找的是解决这个限制的方法,某种方式使.net的Cookie与逗号的工作很好。我发现服务器确实向客户端发送了一个'SET-COOKIE'标题,我猜这是正在解析的内容,但这似乎也明显给commans和分号带来了特殊的意义(因此限制了.NET内部的类)。
然后,IE,Firefox等浏览器如何正确处理cookie(正如他们显然那样,因为网站在我测试过的任何浏览器中都能正常工作。)有没有办法在.NET中强制执行此行为?
任何帮助都将不胜感激,谢谢。
一些其他信息:
我的代码看起来像这样:
request = (HttpWebRequest)WebRequest.Create(URI);
request.CookieContainer = Program.client.cookieJar;
其中cookieJar在Program.client中定义为:
CookieContainer cookieJar = new CookieContainer();
当我循环并打印出CookieContainer中的所有Cookie时,我得到以下内容:( Cookie,格式为:“name” - >“value”)
"normal_cookie" -> "i am the value"
"messedup_cookie" -> "a"
"bcdefghijklmnop" -> ""
// What I should get is this:
"normal_cookie" -> "i am the value"
"messedup_cookie" -> "a,bcdefghijklmnop"
问题的核心似乎是逗号和半冒号是SET-COOKIE标题字符串中的保留字符...但是那么浏览器如何处理这个?我可以自己解析字符串,但我不知道如何绕过这样的情况:( HTTP标题,格式为:“name” - >“value”)
"Set-Cookie" -> "messedup_cookie=a,bcdefghijklmnop; path=/; domain=.domain.com; expires=Sat, 15-Aug-2009 09:14:24 GMT,anothervariable=i am the value;"
如您所见,expires部分查找逗号而不是分号,以区别于下一个变量。据我所知,它的格式为:
cookie1_var1=value; cookie1_var2=value,cookie2_var1=value; cookir2_var2=value
但如果这是真的,是否有一种优雅的方式来处理其中一个值中可能出现的逗号?
答案 0 :(得分:8)
根据the following article,您应该考虑使用UrlEncode和UrlDecode在Cookie中存储值。
private void SetCookie()
{
HttpCookie cookie = new HttpCookie("cookiename");
cookie.Expires = DateTime.Now.AddMonths(24);
cookie.Values.Add("name", Server.UrlEncode(txtName.Text));
Response.Cookies.Add(cookie);
}
private void GetCookie()
{
HttpCookie cookie = Request.Cookies["cookiename"];
if (cookie != null)
{
txtName.Text = Server.UrlDecode(cookie.Values["name"]);
}
}
不要在ASP.NET中对HTML进行HTML编码!它会导致黄色 屏幕死亡和例外 说明cookie包含 危险的人物。
MSDN also has an article关于这个主题。
ASP.NET不编码或取消编码 UrlEncode格式的Cookie 默认。结果,你可以 遭遇意外行为 ASP.NET应用程序。
答案 1 :(得分:4)
要处理cookie,因为cookie本质上是一个字符串,您可能希望在设置之前尝试URL编码cookie值,然后在提取值时解码它。
即:
Response.Cookies["Value1"] = Server.UrlEncode(sCookieValue);
同样地:
string sCookieValue = Server.UrlDecode(Request.Cookies["Value1"]);