深刻学习HttpClient(一)扩展额外的功能

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

   

【类库的设计】 设计模式

   

让咱们先看下Httpclient的设计图:网络

   

   

 

   

图中咱们能够清晰的看出对于HttpClient库而言其请求的过程:架构

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

   

从设计角度来说,HttpClient库提供了强大的扩展性,使用者不须要任何继承便可完成对HttpClient的扩展(若是对设计模式熟悉,能够清楚的看出这里用到了装饰器模式) async

   

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

咱们首先经过代码给Httpclient加一个DebugLog功能: spa

   

那么咱们须要按下面的方式来定义: .net

   

   

   

   

   

上面代码的几点说明: 设计

   

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

二、咱们本身定义了一个LoggingHandler,这个类对应Delegating Handler 是咱们自定义的、装饰在Inner Handler外的Handler

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

   

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

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

   

   

   

在实际使用过程当中咱们能够定义一个方法来统一配置httpClient:

   

   

   

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

   

能够更深刻的参考下面的文章:http://chimera.labs.oreilly.com/books/1234000001708/ch14.html

【总结】

   

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

相关文章
相关标签/搜索