专栏首页.NET技术与企业级解决方案C# HTTP系列4 HttpWebRequest.CookieContainer属性

C# HTTP系列4 HttpWebRequest.CookieContainer属性

HttpWebRequest.CookieContainer 获取或设置与此请求关联的 Cookie。默认情况下CookieContainernull

它是一种数据结构, 它为Cookie类的实例提供存储, 并以类似于数据库的方式访问。 CookieContainer 具有一个容量限制, 该限制是在创建容器或由属性更改时设置的。

Cookie类的实例根据其源 URI 添加到容器中。 它会添加到与 URI CookieCollection关联的内部。 从基于 URI CookieCollection的容器中检索, 或者作为可用于提交 HTTP WebRequests 的字符串从容器中检索。

Cookie 有三个属性, 这些属性控制容器的内容量: CapacityMaxCookieSizePerDomainCapacityCookieContainer 这些值分别为300、4096和20的默认设置。 当将Cookie添加到容器时,这些属性用于确定是否应丢弃CookieContainer中已包含的Cookie以便为新容器腾出空间。 Cookie 跟踪每个加法, 以确保Capacity 不会超过或PerDomainCapacity限制。 CookieContainer 如果超过其中一个或两个, Cookie则将删除由CookieContainer保留的实例。 首先, 删除任何Cookie过期的。 如果必须回收更多的容量, 则会清除最近最少使用CookieCollection的空间。

出于安全原因,默认情况下禁用了 cookie。 如果你想要使用 cookie,则使用CookieContainer属性,以便启用 cookie。

下面的代码示例将请求发送到的 URL,并显示在响应中返回的 cookie。

 1 using System.Net;
 2 using System;
 3 namespace Examples.System.Net.Cookies
 4 {
 5     // 此示例在命令行中运行。
 6     // 指定一个参数:发送请求的主机的名称。
 7     // 如果请求成功,该示例将显示主机返回的cookie的内容。
 8     
 9     public class CookieExample
10     {   
11         public static void Main(string[] args)
12         {   
13             if (args == null || args.Length != 1)
14             {
15                 Console.WriteLine("Specify the URL to receive the request.");
16                 Environment.Exit(1);
17             }
18             HttpWebRequest request = (HttpWebRequest)WebRequest.Create(args[0]);
19             request.CookieContainer = new CookieContainer();
20         
21             HttpWebResponse response = (HttpWebResponse) request.GetResponse();
22             
23             
24 
25             // Print the properties of each cookie.
26             foreach (Cookie cook in response.Cookies)
27             {
28                 Console.WriteLine("Cookie:");
29                 Console.WriteLine("{0} = {1}", cook.Name, cook.Value);
30                 Console.WriteLine("Domain: {0}", cook.Domain);
31                 Console.WriteLine("Path: {0}", cook.Path);
32                 Console.WriteLine("Port: {0}", cook.Port);
33                 Console.WriteLine("Secure: {0}", cook.Secure);
34              
35                 Console.WriteLine("When issued: {0}", cook.TimeStamp);
36                 Console.WriteLine("Expires: {0} (expired? {1})", 
37                     cook.Expires, cook.Expired);
38                 Console.WriteLine("Don't save: {0}", cook.Discard);    
39                 Console.WriteLine("Comment: {0}", cook.Comment);
40                 Console.WriteLine("Uri for comments: {0}", cook.CommentUri);
41                 Console.WriteLine("Version: RFC {0}" , cook.Version == 1 ? "2109" : "2965");
42 
43                 // Show the string representation of the cookie.
44                 Console.WriteLine ("String: {0}", cook.ToString());
45             }
46         }
47     }
48 }
49 
50 // 此示例的输出将根据指定的主机名而有所不同,但将类似于以下内容。
51 /*
52 Cookie:
53 CustomerID = 13xyz
54 Domain: .contoso.com
55 Path: /
56 Port:
57 Secure: False
58 When issued: 1/14/2003 3:20:57 PM
59 Expires: 1/17/2013 11:14:07 AM (expired? False)
60 Don't save: False
61 Comment: 
62 Uri for comments:
63 Version: RFC 2965
64 String: CustomerID = 13xyz
65 */

CookieContainer 在 .NET3.5 与 .NET4.0 中的不同

.NET Framework 4.0 中的 HttpWebRequest.CookieContainer 有bug,参考:https://www.crifan.com/baidu_emulate_login_for_dotnet_4_0_error_the_fisrt_two_args_should_be_string_type_0_1/

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 剑指offer之面试题2:实现Singleton模式

    在上述代码中,Singleton1的静态属性Instance中,只有在instance为null的时候才创建一个实例以避免重复创建。

    Vincent-yuan
  • Swifter.Json 可能是 .Net 平台迄今为止性能最佳的 Json 序列化库【开源】

    Json (JavaScript Object Notation) 是一种轻量级的数据交换格式。它作为目前最欢迎的数据交换格式,也是各大开源贡献者的必争之地,如...

    梁规晓
  • 微软发布了开发社区采用.NET Standard的最新信息

    最近,微软发布了开发社区当前采用.NET Standard的最新信息。.NET Standard是API的正式规范,现有.NET实现在不同平台的是通用的(从而允...

    梁规晓
  • .NET 程序员如何学习Vue

    之所以取这个标题,是因为本文来自内部培训的整理,培训的对象是公司的 .NET 程序员,.NET 程序员学习 Vue 是为了在项目中做二次开发时能够更好地跟产品对...

    oec2003
  • 反手来个K8S入门到跑路(腾讯云版本)

    放假前一两天发现腾讯云托管K8S集群上线好一阵子了, 还支持把原有主机迁入k8s集群, 索性开始搞事了.

    李国宝
  • 高性能JavaScript

    原因:数据存储位置对大地代码整体性能会产生重要的影响,直接变量和局部变量的访问速度快于数组和对象成员。因为局部变量位于作用域链的第一个对象中,全局变量位于作用域...

    Tiffany_c4df
  • Entity Framework 和NHibernate的区别

    从个人感受上看,NHibernate显然是从上而下(Top-down)的方式,天然的POCO支持就是最好的佐证。而ADO.NET Entity Framewor...

    javascript.shop
  • 如何更改Json.NET的序列化规则

    我想要使序列化出来的JSON都是小写,可以通过建立 LowercaseContractResolver:DefaultContractResolver

    javascript.shop
  • .NET CORE 怎么样从控制台中读取输入流

    从Console.ReadList/Read 的源码中,可学习到.NET CORE 是怎么样来读取输入流。

    梁规晓
  • 如何快速创建定时任务【Quartz.NET总结系列一】

    前段时间,花了大量的时间,将原先的计划任务,切换到Quartz.NET来进行管理。原先的后台定时服务都是通过计划任务来实现的,但是随着业务增长,计划任务也越来越...

    章为忠

扫码关注云+社区

领取腾讯云代金券