asp.net Cookie请求头以及响应头值的获取

时间:2021-09-27 11:05:02

今天的内容还得接着昨天的文章继续讲解。上篇文章,我遇到了如何进行同名Cookie值的设置。在上一篇文章中,我设置的Cookie名字是一定的,写死了。今天再次运行项目时发现报错了,单步运行程序发现Cookie的名字竟然变化了,前面的文章是把name写死了,显然不行,需要动态获取Cookie的name以及value。在开始解决问题之前,我们还是先简单了解一下Cookie的基础知识。

Cookie是asp.net 保存会话数据的两种技术之一,另一种技术是Session,在此暂不讲述,以后再补充。Cookie是客户端技术,服务器把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。

                                                           asp.net Cookie请求头以及响应头值的获取

Cookie是一种在客户端保持HTTP状态信息的技术,它好比商场发放的优惠卡。

Cookie是在浏览器访问WEB服务器的某个资源时,由WEB服务器在HTTP响应消息头中附带传送给浏览器的一片数据,WEB服务器传送给各个客户端浏览器的数据是可以各不

相同的。

一旦WEB浏览器保存了某个Cookie,那么它在以后每次访问该WEB服务器时,都应在HTTP请求头中将这个Cookie回传给WEB服务器。

WEB服务器通过在HTTP响应消息中增加Set-Cookie响应头字段将Cookie信息发送给浏览器,浏览器则通过在HTTP请求消息中增加Cookie请求头字段将Cookie回传给WEB服务器

一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。

一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。

                                                                 asp.net Cookie请求头以及响应头值的获取

浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB

如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。

注意,删除cookie时,path必须一致,否则不会删除

                                                                     asp.net Cookie请求头以及响应头值的获取

基础的Cookie 知识大概就是这样,如果想了解具体的请参考:http://blog.sina.com.cn/s/blog_68d733750100kxvh.html

下面就接着文章开始提出的问题接着讲解。在这里,我想要获取到请求头或响应头的所有Cookie信息,包括它的name和value。我采用了下面的方法。

方法1. GetCookies()

            #region 获取请求头Cookie数据
            string sessionid = "";
            string name = "";
            CookieContainer cookieContainer = new CookieContainer();
            //得到cookie
            CookieCollection cookies = cookieContainer.GetCookies(new Uri("http://www.baidu.com"));
            //遍历得到cookie
            if (cookies.Count>0)
            {
                foreach (Cookie cookie in cookies)
                {
                    name = cookie.Name;
                    sessionid = httpclient.Context.Cookies[cookie.Name].Value;
                }
            }
            #endregion
测试未能通过。报未找到主机或UrI实例无效错误,主要就是下面这行代码的问题。

CookieCollection cookies = cookieContainer.GetCookies(new Uri("http://www.baidu.com"));
对Uri也不了解,时间紧迫,没法深究Uri知识,所以*放弃了此种方法。

方法2  Context.Cookies

            CookieCollection cookie = httpclient.Context.Cookies;//获取请求头的Cookie
            if (cookie.Count>0)
            {
                foreach (Cookie cook in cookie)
                {
                    name = cookie.Name;
                    sessionid = httpclient.Context.Cookies[cookie.Name].Value;
                }
            }
            #endregion

测试报错:Cookie不存在Name属性,可Cookie类下明明是有Name属性的,不知为何,此方法行不通,暂时放弃。

                                 

                                                                 asp.net Cookie请求头以及响应头值的获取



方法3.GetResponseHeader()

            string cook = httpclient.GetResponse().GetResponseHeader("Set—Cookie");//获取请求头的Cookie
            string[] args=cook.Split(',');
            foreach (string item in args)
            {
                name = item.Split('=')[0];
                sessionid = item.Split('=')[1];
            }
            #endregion
测试通过。

方法4.ref引用

code = GetCheckCode(ref httpclient);
测试通过。

通过上面四种方法的介绍,我们也可以看出,第四种方法最简单,如果你对应用比较了解,相信此种方法也比较好理解。经过连续几个小时的忙活,最终完成任务。

上面只是就自己实际遇到的问题进行了说明,只是对Cookie的知识进行了简单介绍,其中还有Session的以及URL和Uri的区别等知识没有说明,下面的文章也会就前面的几个问题和大家共同学习,欢迎指导,共同进步。