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

时间:2009-07-16 09:23:16

标签: c# .net cookies httpclient cookiecontainer

我正在创建一个访问网站并登录的客户端+自动执行某些任务,但他们最近更新了他们的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

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

2 个答案:

答案 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"]);