如何将 CookieContainer 转换成字符串保存起来 再转换回来

rightnet2 2012-07-10 10:39:52
如何将 CookieContainer 转换成字符串保存起来 再转换回来

能发两段代码就好了

string a=ToString(CookieContainer )

CookieContainer a=ToCookieContainer (string)



或者可以将类保存起来。.........
...全文
973 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
shui1390594 2012-11-27
  • 打赏
  • 举报
回复
在开HTTP方式提交数据时,有的要登录才能发送数据,如果每次都登录,那就有点浪费时间了,因为网络的问题,很多时间都花来回传输数据上,如果登录后把CookieContainer保存到文件或数据库那就会快很多了。 保存CookieContainer考虑到两种方法,一种是把CookieContainer序列化,再保存,用的时候再反序列化;另一种是遍历出所有的Cookie,再把内容读出来,用的时候再构建新有Cookie,再添加到CookieContainer。经过考虑,决定用第二种,因为Cookie会有时间限制,如果单单的序列化后保存,就有可能会过期,而后一种则可以自己设置时间。 以下的代码可以适用于很多场合,包括论坛,社区,甚至某些邮箱等。当然此处我只是举例,将内容保存到一个文本文件,而实际可可以保存到数据库或其他地方。 首先,我们用一个方法把CookieContainer所有的Cookie读出来,此方法的代码: public static List<Cookie> GetAllCookies(CookieContainer cc) { List<Cookie> lstCookies = new List<Cookie>(); Hashtable table = (Hashtable)cc.GetType().InvokeMember("m_domainTable", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.Instance, null, cc, new object[] { }); foreach (object pathList in table.Values) { SortedList lstCookieCol = (SortedList)pathList.GetType().InvokeMember("m_list", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.Instance, null, pathList, new object[] { }); foreach (CookieCollection colCookies in lstCookieCol.Values) foreach (Cookie c in colCookies) lstCookies.Add(c); } return lstCookies; } 然后我们再保存到文件: StringBuilder sbc = new StringBuilder(); List<Cookie> cooklist = Code.ProgTool.GetAllCookies(CookieContainer); foreach (Cookie cookie in cooklist) { sbc.AppendFormat("{0};{1};{2};{3};{4};{5}\r\n", cookie.Domain,cookie.Name, cookie.Path, cookie.Port, cookie.Secure.ToString(), cookie.Value); } FileStream fs = File.Create("d:\\chinarencookies.txt"); fs.Close(); File.WriteAllText("d:\\chinarencookies.txt", sbc.ToString(), System.Text.Encoding.Default); 读出所有Cookie string[] cookies = File.ReadAllText("d:\\chinarencookies.txt", System.Text.Encoding.Default).Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); foreach (string c in cookies) { string[] cc = c.Split(";".ToCharArray()); Cookie ck = new Cookie(); ; ck.Discard =false; ck.Domain = cc[0]; ck.Expired =true; ck.HttpOnly = true; ck.Name = cc[1]; ck.Path = cc[2]; ck.Port = cc[3]; ck.Secure = bool.Parse(cc[4]); ck.Value = cc[5]; CookieContainer.Add(ck); } 以上做法是转过来的,是没问题的,应该看到懂,存在的问题就是如果遇到一级二级域名存在相同cookie的话会被覆盖,导致读取这个cookie时CookieContainer认为是同一个cookie值 如:.baidu.com 有个cookie 名称:cookiename 值:123456 而baidu.com有个cookie 名称:cookiename 值:123456 这2个域名的path一样 那么保存和读取就会存在覆盖问题
hanxing_c 2012-07-10
  • 打赏
  • 举报
回复
字符串转为cookie container
 string[] arrCookie = cookie.Split(';');

CookieContainer cookie_container = new CookieContainer(); //加载Cookie
//cookie_container.SetCookies(new Uri(url), cookie);
foreach (string sCookie in arrCookie)
{
if (sCookie.IndexOf("expires") > 0)
continue;
cookie_container.SetCookies(new Uri(url), sCookie);
}
LQknife 2012-07-10
  • 打赏
  • 举报
回复
CookieContainer 不是直接有GetCookieHeader返回一个字符串吗。。。
GetCookies返回CookieCollection
具体用法看MSDN
rayyu1989 2012-07-10
  • 打赏
  • 举报
回复
考虑 序列化和反序列化

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧