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

14 .net c# cookies httpclient cookiecontainer

我正在创建一个访问网站并登录的客户端+自动执行某些任务,但是他们最近更新了他们的cookie(无论出于何种原因......)在其标识cookie中包含逗号.

例如,Cookie将具有与此类似的值:

a,bcdefghijklmnop
Run Code Online (Sandbox Code Playgroud)

问题是,根据msdn,你不能在cookie的值中使用逗号或句点.我正在寻找的是解决这个限制的方法,某种方式使.net的Cookie与逗号的工作很好.我发现服务器确实向客户端发送了一个'SET-COOKIE'标题,我猜这是正在解析的内容,但这似乎也明显给commans和分号带来了特殊的意义(因此限制了.NET内部的类).

但是,IE,Firefox等浏览器如何正确处理cookie(正如他们显然那样,因为网站在我测试过的任何浏览器中都能正常工作.)是否有办法强迫这个在.NET中的行为?

任何帮助将不胜感激,谢谢.

---编辑---

一些额外的信息:

我的代码看起来像这样:

request = (HttpWebRequest)WebRequest.Create(URI); 
request.CookieContainer = Program.client.cookieJar;
Run Code Online (Sandbox Code Playgroud)

其中cookieJar在Program.client中定义为:

CookieContainer cookieJar = new CookieContainer();
Run Code Online (Sandbox Code Playgroud)

当我遍历并打印出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" 
Run Code Online (Sandbox Code Playgroud)

问题的核心似乎是逗号和半冒号是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;"
Run Code Online (Sandbox Code Playgroud)

如您所见,expires部分查找逗号而不是分号,以区别于下一个变量.据我所知,它的格式如下:

cookie1_var1=value; cookie1_var2=value,cookie2_var1=value; cookir2_var2=value
Run Code Online (Sandbox Code Playgroud)

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

Seb*_*son 8

根据以下文章,您应该考虑使用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"]);
    }
}
Run Code Online (Sandbox Code Playgroud)

不要在ASP.NET中对HTML进行HTML编码!它会导致黄色的死亡屏幕,并说明cookie包含危险字符.

MSDN也有一篇关于这个主题的文章.

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


And*_*nge 4

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

IE:

Response.Cookies["Value1"] = Server.UrlEncode(sCookieValue);
Run Code Online (Sandbox Code Playgroud)

类似地:

string sCookieValue = Server.UrlDecode(Request.Cookies["Value1"]);
Run Code Online (Sandbox Code Playgroud)