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的执行顺序,是从左往右一次调用
【总结】
HttpClient这一套类库的设计相比之前而言非常的精妙,可以作为典型的设计模式教材了,而在实际开发过程中也为每个开发人员提供了网络层架构的极大遍历,如果你要与.net4.5打交道,那么是时候更新你的工具箱了