HttpClient, HttpClientHandler, and WebRequestHandler Explained
原文地址 https://blogs.msdn.microsoft.com/henrikn/2012/08/07/httpclient-httpclienthandler-and-webrequesthandler-explained/
In two previous blogs I describe how to use HttpClient as well as how to use the HttpMessageHandler pipeline. What we haven’t done explicitly is showing when and how to use HttpClient, HttpClientHandler, and WebRequestHandler. This is the purpose of this blog.
The first thing to remember is that HttpClient uses the HttpMessageHandler pipeline for sending and receiving requests. The default handler implementations (HttpClientHandler and WebRequestHandler) both sit on top of HttpWebRequest which has a lot of properties for controlling how to deal with requests and responses. However, in order to stay simple, HttpClient doesn’t expose all these properties up front – it would make it unwieldy and show a lot of things that are rarely used.
If you need to access these properties then there are two ways of doing it: use either HttpClientHandler or WebRequestHandler. Both are HttpMessageHandlers hooked in as part of the HttpMessageHandler pipeline. Below we will describe when and how to use these handlers, how they differ, as well as how to combine them with your own handlers.
You can find this code for this sample in the aspnet.codeplex.com code repository and there are instructions here for how to use the samples.
HttpClient
The default HttpClient is the simplest way in which you can start sending requests. A single HttpClient can be used to send as many HTTP requests as you want concurrently so in many scenarios you can just create one HttpClient and then use that for all your requests.
HttpClient has a few properties that are commonly used and which you can set up until the point where you start sending requests, namely:
| Name | Description |
|---|---|
| BaseAddress | Gets or sets the base address of Uniform Resource Identifier (URI) of the Internet resource used when sending requests. |
| DefaultRequestHeaders | Gets the headers which should be sent with each request. |
| MaxResponseContentBufferSize | Gets or sets the maximum number of bytes to buffer when reading the response content. |
| Timeout | Gets or sets the number of milliseconds to wait before the request times out. |
Here’s an example of how to create a simple HttpClient and issue a request while setting the timeout for all requests:
1: // Create an HttpClient and set the timeout for requests
2: HttpClient client = new HttpClient();
3: client.Timeout = TimeSpan.FromSeconds(10);
4:
5: // Issue a request
6: client.GetAsync(_address).ContinueWith(
7: getTask =>
8: {
9: if (getTask.IsCanceled)
10: {
11: Console.WriteLine("Request was canceled");
12: }
13: else if (getTask.IsFaulted)
14: {
15: Console.WriteLine("Request failed: {0}", getTask.Exception);
16: }
17: else
18: {
19: HttpResponseMessage response = getTask.Result;
20: Console.WriteLine("Request completed with status code {0}", response.StatusCode);
21: }
22: });
If you have additional handlers which you want to wire up as well then the simplest way is to use the HttpClientFactory class. Here’s an example wiring up 3 custom message handlers:
1: // Create an HttpClient and add message handlers for the client
2: HttpClient client = HttpClientFactory.Create(
3: new SampleHandler("Client A", 2),
4: new SampleHandler("Client B", 4),
5: new SampleHandler("Client C", 6));
HttpClientHandler
HttpClientHandler is an HttpMessageHandler with a common set of properties that works across most versions of the HttpWebRequest API. This is the default handler and so is what you get if you use the default constructor. However, in order to actually get access to the various properties (see below) you have to explicitly create it and then pass it to HttpClient.
| Name | Description |
|---|---|
| AllowAutoRedirect | Gets or sets a value that indicates whether the handler should follow redirection responses. |
| AutomaticDecompression | Gets or sets the type of decompression method used by the handler for automatic decompression of the HTTP content response. |
| ClientCertificateOptions | Gets or sets the collection of security certificates that are associated with this handler. |
| CookieContainer | Gets or sets the cookie container used to store server cookies by the handler. |
| Credentials | Gets or sets authentication information used by this handler. |
| MaxAutomaticRedirections | Gets or sets the maximum number of redirects that the handler follows. |
| MaxRequestContentBufferSize | Gets or sets the maximum request content buffer size used by the handler. |
| PreAuthenticate | Gets or sets a value that indicates whether the handler sends an Authorization header with the request. |
| Proxy | Gets or sets proxy information used by the handler. |
| SupportsAutomaticDecompression | Gets a value that indicates whether the handler supports automatic response content decompression. |
| SupportsProxy | Gets a value that indicates whether the handler supports proxy settings. |
| SupportsRedirectConfiguration | Gets a value that indicates whether the handler supports configuration settings for the AllowAutoRedirect and MaxAutomaticRedirections properties. |
| UseCookies | Gets or sets a value that indicates whether the handler uses the CookieContainer property to store server cookies and uses these cookies when sending requests. |
| UseDefaultCredentials | Gets or sets a value that controls whether default credentials are sent with requests by the handler. |
| UseProxy | Gets or sets a value that indicates whether the handler uses a proxy for requests. |
Here’s an example of how to create an HttpClientHandler, set a property, and pass it to HttpClient:
1: // Create HttpClientHandler and set UseDefaultCredentials property
2: HttpClientHandler clientHandler = new HttpClientHandler();
3: clientHandler.UseDefaultCredentials = true;
4:
5: // Create an HttpClient using the HttpClientHandler
6: HttpClient client = new HttpClient(clientHandler);
Like above, you can combine your HttpClientHandler instance with other custom handlers, here’s what it looks like:
1: // Create HttpClientHandler and set UseDefaultCredentials property
2: HttpClientHandler clientHandler = new HttpClientHandler();
3: clientHandler.UseDefaultCredentials = true;
4:
5: // Create an HttpClient and add message handlers for the client
6: HttpClient client = HttpClientFactory.Create(
7: clientHandler,
8: new SampleHandler("Client A", 2),
9: new SampleHandler("Client B", 4),
10: new SampleHandler("Client C", 6));
WebRequestHandler
WebRequestHandler derives from HttpClientHandler but adds properties that generally only are available on full .NET. The WebRequestHandler is not included in the System.Net.Http DLL but rather in System.Net.Http.WebRequest DLL so you have to explicitly include that as a reference in order to see it. Otherwise it won’t show up.
| Name | Description |
|---|---|
| AllowPipelining | Gets or sets a value that indicates whether to pipeline the request to the Internet resource. |
| AuthenticationLevel | Gets or sets a value indicating the level of authentication and impersonation used for this request. |
| CachePolicy | Gets or sets the cache policy for this request. |
| ClientCertificates | Gets or sets the collection of security certificates that are associated with this request. |
| ContinueTimeout | Gets or sets the amount of time, in milliseconds, the application will wait for 100-continue from the server before uploading data. |
| ImpersonationLevel | Gets or sets the impersonation level for the current request. |
| MaxResponseHeadersLength | Gets or sets the maximum allowed length of the response headers. |
| ReadWriteTimeout | Gets or sets a time-out in milliseconds when writing a request to or reading a response from a server. |
| ServerCertificateValidationCallback | Gets or sets a callback for verifying the remote Secure Sockets Layer (SSL) certificate used for authentication. |
| UnsafeAuthenticatedConnectionSharing | Gets or sets a value that indicates whether to allow high-speed NTLM-authenticated connection sharing. |
Here’s an example of how to create an WebRequestHandler, set a property, and pass it to HttpClient:
1: // Create WebRequestHandler and set UseDefaultCredentials and AllowPipelining (for HTTP) properties
2: WebRequestHandler webRequestHandler = new WebRequestHandler();
3: webRequestHandler.UseDefaultCredentials = true;
4: webRequestHandler.AllowPipelining = true;
5:
6: // Create an HttpClient using the WebRequestHandler
7: HttpClient client = new HttpClient(webRequestHandler);
Again, you can combine the WebRequestHandler with your own handlers as well – here’s what it looks like:
1: // Create WebRequestHandler and set UseDefaultCredentials and AllowPipelining (for HTTP) properties
2: WebRequestHandler webRequestHandler = new WebRequestHandler();
3: webRequestHandler.UseDefaultCredentials = true;
4: webRequestHandler.AllowPipelining = true;
5:
6: // Create an HttpClient and add message handlers for the client
7: HttpClient client = HttpClientFactory.Create(
8: webRequestHandler,
9: new SampleHandler("Client A", 2),
10: new SampleHandler("Client B", 4),
11: new SampleHandler("Client C", 6));
Have fun!
HenrikHttpClient, HttpClientHandler, and WebRequestHandler Explained
HttpClient, HttpClientHandler, and WebRequestHandler Explained的更多相关文章
- HttpClient, HttpClientHandler, and WebRequestHandler介绍
注:本文为个人学习摘录,原文地址:https://blogs.msdn.microsoft.com/henrikn/2012/08/07/httpclient-httpclienthandler-an ...
- 理解并使用.NET 4.5中的HttpClient
HttpClient介绍 HttpClient是.NET4.5引入的一个HTTP客户端库,其命名空间为System.Net.Http..NET 4.5之前我们可能使用WebClient和HttpWeb ...
- 理解并使用.NET 4.5中的HttpClient(转)
原文地址:http://www.cnblogs.com/wywnet/p/httpclient.html HttpClient介绍HttpClient是.NET4.5引入的一个HTTP客户端库,其命名 ...
- httpclient cer
X509Certificate2 cer = new X509Certificate2(@"path", "********", X509KeyStorageF ...
- .Net HttpClient 模拟登录微信公众平台发送消息
1.模拟登录 public WeiXinRetInfo ExecLogin(string name, string pass) { CookieContainer cc = new CookieCon ...
- 使用HttpClient发送GET请求
HttpRequestMessage http_req_msg = new HttpRequestMessage(); http_req_msg.Method = HttpMethod.Get; ht ...
- .net 中HttpClient 携带cookie传输
CookieContainer cookieContainer = new CookieContainer(); Cookie cookie = new Cookie("username&q ...
- HttpClient Received an unexpected EOF or 0 bytes from the transport stream
请求https链接时报错,奇怪的是pc1正常,pc2异常 Unhandled Exception: System.AggregateException: One or more errors occu ...
- .Net Core HttpClient 忽略https证书提醒
在测试中经常会遇到请求一些https的url,但又没有本地证书,这时候可以用下面的方法忽略警告 var httpclientHandler = new HttpClientHandler(); htt ...
随机推荐
- redis 学习笔记(1)-编译、启动、停止
一.下载.编译 redis是以源码方式发行的,先下载源码,然后在linux下编译 1.1 http://www.redis.io/download 先到这里下载Stable稳定版,目前最新版本是2.8 ...
- [word]用Word2007查找和替换功能批量设置图片位置
Word2007的"查找和替换"功能并不仅仅可以对文字进行批量的查找替换,还有很多神奇的功能,比如对插入的图片位置进行批量的查找和调整等等. 今天我们就来试试Word2007的&q ...
- .Net开源微型ORM框架测评
什么是ORM? 对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间 ...
- jprofiler_监控远程linux服务器的tomcat进程(实践)
一.软件列表: windows和linux的jprofiler的版本必须一致 1.jprofiler_linux_9_1_1.tar.gz 2.jprofiler_windows_x64 9_1_1 ...
- Java中使用Jedis操作Redis(转载)
整理 1.字符串 添加:set keyname value 查询:get keyname 拼接:append keyname value 删除:del keyname 添加多个: mset keyna ...
- WIN10 CMD 启动虚拟WIFI
1.以管理员身份运行命令提示符: 快捷键win+R→输入cmd→回车 2.启用并设定虚拟WiFi网卡: 运行命令:netsh wlan set hostednetwork mode=allow ssi ...
- elasticsearch 优化
ES 手册 如何提高ES的性能 不要返回较大的结果集 ES是设计成一个搜索引擎的,只擅长返回匹配查询较少文档,如果需要返回非常多的文档需要使用Scroll. 避免稀疏 因为ES是基于Lucene来索引 ...
- php常用数组函数小结
count函数 作用:计算数组中元素的个数或对象的属性个数 返回值: 数组或者对象, 返回数组的单元个数或者对象的属性个数 Null,返回0 非数组,也非NULL,通通返回1 <?php $ar ...
- Linux解压,压缩小总结
linux下打包与解压的三种命令 最近在读<鸟歌的Linux私房菜基础篇>,想着总结一下所读知识,有益于理解. Linux下常用的命令有三种 gzip,zcat(用于zip,gzip等) ...
- [NHibernate]立即加载
目录 写在前面 文档与系列文章 立即加载 一个例子 总结 写在前面 上篇文章介绍了nhibernate延迟加载的相关内容,简单回顾一下延迟加载,就是需要的时候再去加载,需要的时候再向数据库发出sql指 ...