Asp.Net Web API 2第四课——HttpClient消息处理器
2016-03-29 09:03
435 查看
前言
消息处理器是一个接收HTTP请求,并返回HTTP响应的一个类。
比较有代表性的时,一系列的消息处理被链接在一起。第一个处理器接收HTTP请求,做一些处理,然后将此请求传给下一个处理器。在某个点上,这个响应被创建,被进行回溯。这种模式就叫做委托处理器。
在客户端,HTTPClient类使用一个消息处理器来处理请求。默认的处理器是HTTPClientHandler,它通过网络发送请求,并从服务器上获得响应。你可以把自定义消息处理器插入到客户端管道中。
Asp.Net Web API也可以使用服务端的消息处理器。更多的信息请参考"HTTP消息处理器"(暂未实现。)
自定义消息处理器
要编写一个消息处理器,需要从System.Net.Http.DelegatingHandler进行派生,并重写SendAsync方法。以下是该方法的签名:
这个方法以HttpRequestMessage参数作为输入,并异步地返回一个HttpResponseMessage。一种典型的实现如下:
1.处理请求消息。
2.调用base.SendAsync将请求发送给内部处理器。
3.内部处理器返回一条响应消息。(这一步是异步的)
4.处理响应,并把他返回给调用者。
以下示例展示了一个消息处理器,它添加了一个自定义的标头给外部的请求。
对base.SendAsync的调用是异步的。如果处理器在调用之后还要做一些工作,需使用await关键字,以便在方法完成之后继续执行。
以下示例展示了一个对错误码进行日志的处理器。如何进行日志没多大关系,但此例展示了如何得到处理器内部的响应。
将消息处理器添加到客户端管线
要将自定义处理器添加到HttpClient,需使用HttpClientFactory.Create方法:
消息处理器是按照它们传递给Create方法中的顺序来调用的。因此处理器是内嵌的,响应消息以反方向传递。即,最后一个处理器首先得到响应消息。
总结
本文主要讲解HTTPClient消息处理器。涉及到的代码在文中都有过展示,暂时就不进行上传了。
本文参考链接http://www.asp.net/web-api/overview/web-api-clients/httpclient-message-handlers
消息处理器是一个接收HTTP请求,并返回HTTP响应的一个类。
比较有代表性的时,一系列的消息处理被链接在一起。第一个处理器接收HTTP请求,做一些处理,然后将此请求传给下一个处理器。在某个点上,这个响应被创建,被进行回溯。这种模式就叫做委托处理器。
在客户端,HTTPClient类使用一个消息处理器来处理请求。默认的处理器是HTTPClientHandler,它通过网络发送请求,并从服务器上获得响应。你可以把自定义消息处理器插入到客户端管道中。
Asp.Net Web API也可以使用服务端的消息处理器。更多的信息请参考"HTTP消息处理器"(暂未实现。)
自定义消息处理器
要编写一个消息处理器,需要从System.Net.Http.DelegatingHandler进行派生,并重写SendAsync方法。以下是该方法的签名:
System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken);
这个方法以HttpRequestMessage参数作为输入,并异步地返回一个HttpResponseMessage。一种典型的实现如下:
1.处理请求消息。
2.调用base.SendAsync将请求发送给内部处理器。
3.内部处理器返回一条响应消息。(这一步是异步的)
4.处理响应,并把他返回给调用者。
以下示例展示了一个消息处理器,它添加了一个自定义的标头给外部的请求。
public class MessageHandler : DelegatingHandler { private int _count = 0; protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) { _count++; request.Headers.Add("X-Custom-Header", _count.ToString()); return base.SendAsync(request, cancellationToken); } }
对base.SendAsync的调用是异步的。如果处理器在调用之后还要做一些工作,需使用await关键字,以便在方法完成之后继续执行。
以下示例展示了一个对错误码进行日志的处理器。如何进行日志没多大关系,但此例展示了如何得到处理器内部的响应。
public class LoggingHandler : DelegatingHandler { StreamWriter _writer; public LoggingHandler(Stream stream) { _writer = new StreamWriter(stream); } protected override async System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) { var response = await base.SendAsync(request, cancellationToken); if (!response.IsSuccessStatusCode) { _writer.WriteLine("{0}\t{1}\t{2}", request.RequestUri,(int)response.StatusCode, response.Headers.Date); } return response; } protected override void Dispose(bool disposing) { if (disposing) { _writer.Dispose(); } base.Dispose(disposing); } }
将消息处理器添加到客户端管线
要将自定义处理器添加到HttpClient,需使用HttpClientFactory.Create方法:
HttpClient client = HttpClientFactory.Create(new MessageHandler());
消息处理器是按照它们传递给Create方法中的顺序来调用的。因此处理器是内嵌的,响应消息以反方向传递。即,最后一个处理器首先得到响应消息。
总结
本文主要讲解HTTPClient消息处理器。涉及到的代码在文中都有过展示,暂时就不进行上传了。
本文参考链接http://www.asp.net/web-api/overview/web-api-clients/httpclient-message-handlers
相关文章推荐
- JAVA基于TCP和UDP的网络连接
- http://www.linuxidc.com/Linux/2014-06/102856.htm
- TCP协议的三次握手
- Google谷歌首席科学家:神经网络的奇妙特性与应用
- openwrt中uhttpd替换成lighttpd
- http://www.codeceo.com/article/8-java-search-engine.html
- Bzoj4443:[Scoi2015]小凸玩矩阵:网络流
- 计算机网络的网络类别
- Android之Handler在新线程中读取网络的两种方法
- kubernetes 网络
- java RPC系列之二 HTTPINVOKER
- JGit与远程仓库链接使用的两种验证方式(ssh和https)
- 【网络流】BZOJ 3876 [Ahoi2014]支线剧情
- <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />隐藏<!DOCTYPE HTML>
- 在 Django/Flask 开发服务器上使用 HTTPS
- java-socket多线程网络编程案列--搭建本地简易聊天对话服务器
- 简单理解http请求及Socket,以及基本的数据传输协议,三次握手
- http转发json(数据转json),以及收到数据解析json
- linux网络设置
- Say Hello to HTTP/2