今天的内容还得接着昨天的文章继续讲解。上篇文章,我遇到了如何进行同名Cookie值的设置。在上一篇文章中,我设置的Cookie名字是一定的,写死了。今天再次运行项目时发现报错了,单步运行程序发现Cookie的名字竟然变化了,前面的文章是把name写死了,显然不行,需要动态获取Cookie的name以及value。在开始解决问题之前,我们还是先简单了解一下Cookie的基础知识。
Cookie是asp.net 保存会话数据的两种技术之一,另一种技术是Session,在此暂不讲述,以后再补充。Cookie是客户端技术,服务器把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
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。
浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB
如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。
注意,删除cookie时,path必须一致,否则不会删除
基础的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属性的,不知为何,此方法行不通,暂时放弃。
方法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的区别等知识没有说明,下面的文章也会就前面的几个问题和大家共同学习,欢迎指导,共同进步。