HttpClient作为.net4.5新增的Http库除了对于async/await形式的异步支持外,还向我们展示了其强大的扩展能力。

【类库的设计】

让我们先看下Httpclient的设计图:

图中我们可以清晰的看出对于HttpClient库而言其请求的过程:

从Request发起,经过DelegatingHanlder处理后,进入InnerHandler,数据返回后再从Inner Handler 返回到Delegating Hanlder进行处理,最后返回结果。

从设计角度来讲,HttpClient库提供了强大的扩展性,使用者不需要任何继承即可完成对HttpClient的扩展(如果对设计模式熟悉,可以清楚的看出这里用到了装饰器模式)

先让我们来看一段实际的代码宏观的对HttpClient很方便的扩展有更具体的认识:

我们首先通过代码给Httpclient加一个DebugLog功能:

那么我们需要按下面的方式来定义:

上面代码的几点说明:

1、对于HttpClient这个类而言,其本身并不会进行实际的网络请求收发处理,我们应将其理解成一个容器、一个中继者,实际的网络请求核心在HttpClientHanlder中,也就是前面图中对应的Inner Handler。

2、我们自己定义了一个LoggingHandler,这个类对应Delegating Handler 是我们自定义的、装饰在Inner Handler外的Handler

3、DelegatingHandler重载了SendAsync,在其内部调用了InnerHandler的SendAsync方法,如此我们便可以在实际请求发出,以及返回后进行各种统一的处理,总结起来仍是上面图中画出的,逐层调用。

一个例子可能不足以让人理解透彻,我们可以展开思路,为httpClient定制出更多的功能,比如下面的例子:

为httpClient扩展出失败重试的逻辑:实际使用方式

在实际使用过程中我们可以定义一个方法来统一配置httpClient:

1、注意自定义的Handler的执行顺序,是从左往右依次调用

可以更深入的参考下面的文章:http://chimera.labs.oreilly.com/books/1234000001708/ch14.html

【总结】

HttpClient这一套类库的设计相比之前而言非常的精妙,可以作为典型的设计模式教材了,而在实际开发过程中也为每个开发人员提供了网络层架构的极大遍历,如果你要与.net4.5打交道,那么是时候更新你的工具箱了

最新文章

  1. Java Web之会话管理一: 使用Cookie进行会话管理
  2. [Nginx] - PHP+FPM相关的配置
  3. 上不了Google是码农的悲哀
  4. http,ftp
  5. JavaWeb项目开发案例精粹-第3章在线考试系统-007View层
  6. Codeforces Round #322 (Div. 2) —— F. Zublicanes and Mumocrates
  7. Fiddler 教程(转)
  8. GCC/G++ 学习笔记
  9. ExtJS4 的dom
  10. Jackson序列化实例
  11. 玩玩微信公众号Java版之二:接收、处理及返回微信消息
  12. jndi通俗理解以及它的指令缺陷
  13. Github Desktop 克隆新项目 Authentication failed. You may not have permission to access the repository or the repository may ha
  14. Spring Boot + Spring Cloud 构建微服务系统(三):服务消费和负载(Feign)
  15. 切割模型固定写死了切平面方程是y=0.1
  16. JavaScript-模拟收银台小程序
  17. Hibernate的hql语句save,update方法不执行
  18. Unity预计算全局光照的学习(速度优化,LightProbe,LPPV)
  19. ambassador 学习六 Module说明
  20. arean.c

热门文章

  1. adore-ng笔记和Linux普通用户提权
  2. java设计模式0--设计模式简介
  3. 如何在mysql数据库中保存emoji特殊字符
  4. python 3 爬取百度图片
  5. [Node.js] Level 5. Express
  6. ie debugger注册码
  7. 淘宝网前端开发面试题(一)--HTML & CSS 面试题
  8. Python中的作用域
  9. 本地计算机上的OracleOraDb11g_home2TNSListener服务启动又停止了。一些服务自动停止,如果他们没有什么可做的 .
  10. es5 - array - unshift