原文地址 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:

The properties exposed by HttpClient directly
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.

List of Properties for HttpClientHandler
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.

List of Properties for WebRequestHandler in addition to those of HttpClientHandler
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的更多相关文章

  1. HttpClient, HttpClientHandler, and WebRequestHandler介绍

    注:本文为个人学习摘录,原文地址:https://blogs.msdn.microsoft.com/henrikn/2012/08/07/httpclient-httpclienthandler-an ...

  2. 理解并使用.NET 4.5中的HttpClient

    HttpClient介绍 HttpClient是.NET4.5引入的一个HTTP客户端库,其命名空间为System.Net.Http..NET 4.5之前我们可能使用WebClient和HttpWeb ...

  3. 理解并使用.NET 4.5中的HttpClient(转)

    原文地址:http://www.cnblogs.com/wywnet/p/httpclient.html HttpClient介绍HttpClient是.NET4.5引入的一个HTTP客户端库,其命名 ...

  4. httpclient cer

    X509Certificate2 cer = new X509Certificate2(@"path", "********", X509KeyStorageF ...

  5. .Net HttpClient 模拟登录微信公众平台发送消息

    1.模拟登录 public WeiXinRetInfo ExecLogin(string name, string pass) { CookieContainer cc = new CookieCon ...

  6. 使用HttpClient发送GET请求

    HttpRequestMessage http_req_msg = new HttpRequestMessage(); http_req_msg.Method = HttpMethod.Get; ht ...

  7. .net 中HttpClient 携带cookie传输

    CookieContainer cookieContainer = new CookieContainer(); Cookie cookie = new Cookie("username&q ...

  8. HttpClient Received an unexpected EOF or 0 bytes from the transport stream

    请求https链接时报错,奇怪的是pc1正常,pc2异常 Unhandled Exception: System.AggregateException: One or more errors occu ...

  9. .Net Core HttpClient 忽略https证书提醒

    在测试中经常会遇到请求一些https的url,但又没有本地证书,这时候可以用下面的方法忽略警告 var httpclientHandler = new HttpClientHandler(); htt ...

随机推荐

  1. openstack上创建vm实例后,状态为ERROR问题解决

    问题说明:在openstack上创建虚拟机,之前已顺利创建了n个centos6.8镜像的vm现在用ubuntu14.04镜像创建vm,发现vm创建后的状态为ERROR! 1)终端命令行操作vm创建 [ ...

  2. React业务实践

    总结自:http://reactjs.cn/react/docs/thinking-in-react-zh-CN.html 当接到一个需求时,如何用react来实现? 以下几个步骤做参考. 第一步:把 ...

  3. 用CSS正确显示人民币符号的HTML转义字符

    做电子商务的难免要跟钱打交道,特别是跟人民币接触更多,但人民币符号长什么样呢,是¥还是¥?糊涂了吧^~^,要知道答案很简单,找出一张新的一百元大钞,在背面看看那个防伪的银线,上面就有. 我们做网页时要 ...

  4. 【分享】仿东软OA协同办公服务管理源码

    功能列表: 1.个人办公管理: 内部邮件.消息管理.手机短信.公告通知.新闻管理.投票管理.个人考勤 日程安排:我的安排.下属安排 工作日志:我的日志.日志查询.日志设置 工作汇报:我的汇报.下属汇报 ...

  5. 序列化效率比拼——谁是最后的赢家Newtonsoft.Json

    前言:作为开发人员,对象的序列化恐怕难以避免.楼主也是很早以前就接触过序列化,可是理解都不太深刻,对于用哪种方式去做序列化更是随波逐流——项目中原来用的什么方式照着用就好了.可是这么多年自己对于这东西 ...

  6. Fluent Nhibernate之旅(五)--利用AutoMapping进行简单开发

    Fluent Nhibernate(以下简称FN)发展到如今,已经相当成熟了,在Nhibernate的书中也相应的推荐了使用FN来进行映射配置,之前写的FN之旅至今还有很多人会来私信我问题,说来惭愧, ...

  7. 第一章,阿里的Dubbo完美初级搭建,待续。。。

    1.1 后台工程搭建分析 Web工程. Maven的常见打包方式:jar.war.pom Pom工程一般都是父工程,管理jar包的版本.maven插件的版本.统一的依赖管理.聚合工程. Taotao- ...

  8. CentOS 6.5安装在VMWare中Bridge模式下网卡eth0不能自动激活的问题

    VMWare 12.5.2 CentOS 6.5 basic VMWare网卡配置选择Bridge方式 问题: 默认情况下ifconfig命令只能看到网络设备lo,看不到eth0,也没有分配合理的IP ...

  9. Linux的学习日记

    CURL 在Ubuntu下尝试安装通过包安装Node.js的时候有这样一种安装方法, 那么有必要学学CURL的知识了. curl是利用URL语法在命令行方式下工作的开源文件传输工具.它被广泛应用在Un ...

  10. mui事件绑定和可以用的js dom操作方法

    <script> //事件绑定 对象 方法 子元素 回调函数 mui('body').on('shown', '.mui-popover', function(e) { //console ...