C# CookieContainer 可以像Cookie那样设置存储时长吗

麻辣麻辣香锅QAQ 2019-01-08 02:39:39
用C#编写的程序 模拟登录网站后台,想让这个程序关了之后再次开启时还能保持登录状态;我的Cookie 是用CookieContainer类型;像求教下大佬们能不能实现,或者能提供一个小demo;小生万分感谢!!
...全文
333 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
左耳边的期盼 2019-01-29
  • 打赏
  • 举报
回复
十分感谢,领教了!
吹风的兔子 2019-01-23
  • 打赏
  • 举报
回复
引用 4 楼 左耳边的期盼 的回复:
@吹风的兔子 我也遇到这个问题了 在进行遍历反序列化的时候出现错误 可以吧你的大致代码贴出来吗?大家互相学习下 可以吗?或者发我QQ:1639624564 感谢啦!
代码在楼上,请查收。
吹风的兔子 2019-01-23
  • 打赏
  • 举报
回复


    /// <summary>
    /// .Net 内置 Cookie 不支持序列化, 所以需要一个 可序列化的 Cookie 实例
    /// </summary>
    [Serializable]
    internal class HttpCookieInfo
    {
        private string m_Name = string.Empty;
        private string m_Value = string.Empty;
        private string m_Path = string.Empty;
        private string m_Domain = string.Empty;
        private DateTime m_Expires = DateTime.MinValue;

        public string Name
        {
            get { return m_Name; }
            set { m_Name = (value ?? string.Empty).Trim(); }
        }
        public string Value
        {
            get { return m_Value; }
            set { m_Value = (value ?? string.Empty).Trim(); }
        }
        public string Path
        {
            get { return m_Path; }
            set { m_Path = (value ?? string.Empty).Trim(); }
        }
        public string Domain
        {
            get { return m_Domain; }
            set { m_Domain = (value ?? string.Empty).Trim(); }
        }
        public DateTime Expires
        {
            get { return m_Expires; }
            set { m_Expires = value; }
        }


        public override string ToString()
        {
            return string.Format("{0}={1}", this.Name, this.Value);
        }
        public static string JoinCookie(List<HttpCookieInfo> listCookie)
        {
            if (listCookie == null || listCookie.Count <= 0) return string.Empty;

            HttpSimpDict<string, HttpCookieInfo> hashTemp = new HttpSimpDict<string, HttpCookieInfo>();
            foreach (HttpCookieInfo cookieInfo in listCookie)
                if (cookieInfo != null) hashTemp[cookieInfo.Name] = cookieInfo;

            List<HttpCookieInfo> listTemp = new List<HttpCookieInfo>(hashTemp.Values);
            //string result = string.Join("; ", listTemp.Select(x => x.Express)); //N40String.Join("; ", N40IList.Select(listTemp, (x => x.Express)));
            string result = string.Join("; ", listTemp.Select(x => string.Format("{0}={1}", x.Name, x.Value))); //N40String.Join("; ", N40IList.Select(listTemp, (x => string.Format("{0}={1}",x.Name,x.Value))));
            return result;
        }
    }


        private static object FileDeserialize(string path, bool withZip)
        {
            if (!System.IO.File.Exists(path)) return null;

            try
            {
                BinaryFormatter myBf = new BinaryFormatter();
                using (FileStream myFs = new FileStream(path, FileMode.Open, FileAccess.Read))
                {
                    Stream stream = withZip ? (Stream)new GZipStream(myFs, CompressionMode.Decompress) : (Stream)myFs;

                    object record = null;
                    try { record = myBf.Deserialize(stream); }
                    finally { stream.Close(); stream.Dispose(); }
                    return record;
                }
            }
            catch (Exception exp)
            {
                //throw new Exception(string.Format("读取磁盘序列化失败: {0}", exp.Message));
                return null;
            }
        }
        private static bool FileSerialize(string path, object record, bool withZip)
        {
            //if (!System.IO.File.Exists(path)) return false;

            try
            {
                System.IO.Directory.CreateDirectory(path);
                BinaryFormatter myBf = new BinaryFormatter();
                using (FileStream myFs = new FileStream(path, FileMode.Create, FileAccess.ReadWrite))
                {
                    Stream stream = withZip ? (Stream)new GZipStream(myFs, CompressionMode.Compress) : (Stream)myFs;

                    try { myBf.Serialize(stream, record); }
                    finally { stream.Close(); stream.Dispose(); }
                }
                return true;
            }
            catch (Exception exp)
            {
                //throw new Exception(string.Format("写入磁盘序列化失败: {0}", exp.Message));
                return false;
            }
        }




                //如果 设置了 CookieContainer 就不能用 Headers 设置Cookie
               //将 磁盘文件 反序列化 成 Cookie对象集合
                List<HttpCookieInfo> listCookie = (List<HttpCookieInfo>)FileDeserialize(@"D:\AAAA.cookie");

                //string joinCookie = HttpCookieInfo.JoinCookie(listCookie);
                //if (!String.IsNullOrWhiteSpace(joinCookie))
                //    request.Headers[HttpRequestHeader.Cookie] = joinCookie;

                //将 Cookie对象集合 添加到 HttpWebRequest 请求中
                if (listCookie != null && listCookie.Count >= 1)
                {
                    foreach (HttpCookieInfo cookieInfo in listCookie)
                    {
                        Cookie cookie = new Cookie(cookieInfo.Name, cookieInfo.Value, cookieInfo.Path, cookieInfo.Domain);
                        cookie.Expires = cookieInfo.Expires;
                        request.CookieContainer.Add(cookie);
                    }
                }















左耳边的期盼 2019-01-13
  • 打赏
  • 举报
回复
@吹风的兔子 我也遇到这个问题了 在进行遍历反序列化的时候出现错误
可以吧你的大致代码贴出来吗?大家互相学习下 可以吗?或者发我QQ:1639624564 感谢啦!
吹风的兔子 2019-01-10
  • 打赏
  • 举报
回复
引用 2 楼 MrSmarter 的回复:
[quote=引用 1 楼 吹风的兔子 的回复:] Demo没有 —— 但是我这边已经实现。 方案如下: 将 CookieContainer 中的数据 获取出来,通过 序列化 存入磁盘。 下次 再发送请求时,反序列化 得到数据,写入 CookieContainer 发给服务器。
那请问你那个可以保持多长时间的登录状态[/quote] 保存永久 —— 只要服务器不认定 Cookie 失效。 【普通浏览器,有些网站,你明明已经登录了,有Cookie 就能免登录 —— 但实际登录时,服务器还是会验证一下 Cookie值 是否过期】
  • 打赏
  • 举报
回复
引用 1 楼 吹风的兔子 的回复:
Demo没有 —— 但是我这边已经实现。

方案如下:
将 CookieContainer 中的数据 获取出来,通过 序列化 存入磁盘。

下次 再发送请求时,反序列化 得到数据,写入 CookieContainer 发给服务器。


那请问你那个可以保持多长时间的登录状态
吹风的兔子 2019-01-08
  • 打赏
  • 举报
回复
Demo没有 —— 但是我这边已经实现。 方案如下: 将 CookieContainer 中的数据 获取出来,通过 序列化 存入磁盘。 下次 再发送请求时,反序列化 得到数据,写入 CookieContainer 发给服务器。

17,741

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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