使用.net(C#)System.Net.Cookie处理cookie值中的逗号

我正在创建一个访问网站并登录的客户端+自动执行某些任务,但是他们最近更新了他们的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时,我得到以下内容:( cookies,格式为:“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 

但如果这是真的,是否有一种优雅的方式来处理可能出现在其中一个值中的逗号?

根据以下文章 ,您应该考虑使用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也有一篇关于这个主题的文章 。

默认情况下,ASP.NET不对UrlEncode格式的cookie进行编码或取消编码。 因此,您可能会在ASP.NET应用程序中遇到意外行为。

要处理cookie,因为cookie本质上是一个字符串,您可能希望在设置之前尝试URL编码cookie值,然后在提取值时对其进行解码。

即:

 Response.Cookies["Value1"] = Server.UrlEncode(sCookieValue); 

同样地:

 string sCookieValue = Server.UrlDecode(Request.Cookies["Value1"]);