zoukankan      html  css  js  c++  java
  • Asp.Net Web API 2第四课——HttpClient消息处理器

    Asp.Net Web API 导航

        Asp.Net Web API第一课:入门http://www.cnblogs.com/aehyok/p/3432158.html

          Asp.Net Web API第二课:CRUD操作http://www.cnblogs.com/aehyok/p/3434578.html

          Asp.Net Web API第三课:.NET客户端调用Wep API http://www.cnblogs.com/aehyok/p/3439698.html

    前言

    消息处理器是一个接收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}	{1}	{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

  • 相关阅读:
    没有插件的sublime编辑器是没有灵魂的
    原生JS简单的无缝自动轮播
    自学前端的日子,记录我的秃头之旅
    简洁快速的数组去重
    最困难的是带着自己的选择生活下去
    css画图那些事
    css3画图那些事(三角形、圆形、梯形等)
    SVN那些事
    关于使用JQ scrollTop方法进行滚动定位
    linux下mysql出现Access denied for user 'root'@'localhost' (using password: YES)解决方法
  • 原文地址:https://www.cnblogs.com/aehyok/p/3442277.html
Copyright © 2011-2022 走看看