消息拦截器是一个类,接收 HTTP request并返回 HTTP response,Message handler 继承自抽象类 HttpMessageHandler,那么学习消息过滤器之前你应该了解下webapi的执行流程。

以上是webapi的执行流程,先是从response开始执行一套顺序之后通过network再回到了Request,其中经过了messageHandler,因为它是webapi架构中给我们可以自定义handler的地方,这和以往的webform差不多。都是基于http请求的。

有可能你会说这和过滤器Aop模式差不多啊,但你可以看完这篇文章之后再比比谁强大,当然它两者的用处都不同。

那消息拦截器有什么用呢,听名字我觉得你应该就知道是怎么回事,它是可以在客户端请求用修改请求信息的中间层,再次其中我们可以修改;添加 response headers,在到达 controller 之前,进行参数验证!

自定义  MessageHandler 需要继承 System.Net.Http.DelegatingHander 并且重载 SendAsync 方法

public class MessageHandler1 : DelegatingHandler
{protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken){Debug.WriteLine("hello");var response = await base.SendAsync(request, cancellationToken);Debug.WriteLine("bye");return response;}
}

这是最基本的处理流程,当然自此期间你需要去添加配置。

public static class WebApiConfig
{public static void Register(HttpConfiguration config){config.MessageHandlers.Add(new MessageHandler1());config.MessageHandlers.Add(new MessageHandler2());}
}

 在消息拦截器中常见的是要判断用户信息,因为像ActionFilterAttribute、ApiControllerActionInvoker、ExceptionFilterAttribute 这些都是在action之前的,那我们就要在之前进行判断。

在HttpRequestMessage中包含了以下属性,这些你都是可以改的。

如何操作header?

 protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken){HttpResponseMessage response = await base.SendAsync(request, cancellationToken);response.Headers.Add("X-Custom-Header", "This is my custom header.");return response;}

 首先调用sendAsync将请求传递给inner handler,让它返回响应信息,但是它在创建异步的时候,响应消息是不可用的。

只能全局去配置吗?

//路由中指定Message Handlerconfig.Routes.MapHttpRoute(name: "Route2",routeTemplate: "api2/{controller}/{id}",defaults: new { id = RouteParameter.Optional },handler: new MessageHandler2() // per-route message handler);

这时MessageHandler2替换默认的HttpControllerDispatcher。这个栗子中MessageHandler2创建响应,匹配“Route2”的请求永远不会转到控制器。这使我们可以使用自己的自定义响应替换整个Web API控制器机制。

不知道你有没有想过,如果你的webapi不支持一些特殊的请求,你该怎么办呢,这个时候呵呵,你应该知道了吧!

在这个实例中我们定义了一个集合,在post请求中,一定不是get,那么就有可能是put 或者delete等待的请求头,那么我们可以获取进行修改。

public class MethodOverrideHandler : DelegatingHandler{readonly string[] _methods = { "DELETE", "HEAD", "PUT" };const string _header = "X-HTTP-Method-Override";protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken){if (request.Method == HttpMethod.Post && request.Headers.Contains(_header)){var method = request.Headers.GetValues(_header).FirstOrDefault();if (_methods.Contains(method, StringComparer.InvariantCultureIgnoreCase)){request.Method = new HttpMethod(method);}}return base.SendAsync(request, cancellationToken);}}

那我们可以获取请求头,如何进行添加呢??

public class CustomHeaderHandler : DelegatingHandler
{ async protected override Task<HttpResponseMessage> SendAsync( HttpRequestMessage request, CancellationToken cancellationToken) { HttpResponseMessage response = await base.SendAsync(request, cancellationToken); response.Headers.Add("X-Custom-Header", "This is my custom-header."); return response; }
}

  在以上代码中我们通过base.SendAsync调用内部消息处理器返回相应结果,base.SendAsync之前是不可响应获取消息的。

  这个示例使用了await关键字,以便在SendAsync完成之后异步地执行任务。

  protected override Task<HttpResponseMessage> SendAsync( HttpRequestMessage request, CancellationToken cancellationToken) { return base.SendAsync(request, cancellationToken).ContinueWith( (task) => { HttpResponseMessage response = task.Result; response.Headers.Add("X-Custom-Header", "This is my custom header."); return response; } ); } 

转载于:https://www.cnblogs.com/ZaraNet/p/10041289.html

【干货】.NET WebApi HttpMessageHandler管道相关推荐

  1. mysql数据库插入datetime_往MySQL数据库datetime类型字段中插入数据库的当前时间

    代码: StringBuilder sb = new StringBuilder(); sb.append(" insert into uosdetailfile ("); sb. ...

  2. Java实现短信验证码最佳实践

    1.背景 2.实现 3.运行效果: 4.源码 5.总结 1.背景 年初,从外地转移阵地到西安,转眼已两个多月.很久不写业务代码了,到了新公司,条件恶劣到前所未有,从需求,设计,架构,实现,实施,测试, ...

  3. qt程序卡死 linux,QtCreator中打开.ui文件时卡死崩溃的解决方法

    用Java实现单链表的基本操作 笔试题中经常遇到单链表的考题,下面用java总结一下单链表的基本操作,包括添加删除节点,以及链表转置. package mars; //单链表添加,删除节点 publi ...

  4. Dotnet Core IHttpClientFactory深度研究

    今天,我们深度研究一下IHttpClientFactory.   一.前言 最早,我们是在Dotnet Framework中接触到HttpClient. HttpClient给我们提供了与HTTP交互 ...

  5. 短信验证码“最佳实践”

    1.背景 年初,从外地转移阵地到西安,转眼已两个多月.很久不写业务代码了,到了新公司,条件恶劣到前所未有,从需求,设计,架构,实现,实施,测试,bug修复,项目计划制定,项目管理,全他妈我一个人,关键 ...

  6. ASP.NET Web API 入门 (API接口、寄宿方式、HttpClient调用)

    一.ASP.NET Web API接口定义 ASP.NET Web API默认实现了Action方法和HTTP方法的映射,Action方法方法名体现了其能处理的请求必须采用的HTTP方法 二.寄宿方式 ...

  7. DDD实战11 在项目中使用JWT的token 进行授权验证

    步骤: 1.首先要在webapi的管道中 使用认证(Authentication) 2.要在webapi的服务中注册验证条件 代码如下: namespace Dealer.WebApi {public ...

  8. 《ASP.NET Web API 2框架揭秘》

    <ASP.NET Web API 2框架揭秘> 基本信息 作者: 蒋金楠 出版社:电子工业出版社 ISBN:9787121235368 上架时间:2014-7-5 出版日期:2014 年7 ...

  9. horizon流程图_仪表、管道、阀门等化工工艺流程图的设计及画法,超多干货,等您来收!...

    原标题:仪表.管道.阀门等化工工艺流程图的设计及画法,超多干货,等您来收! 小编本次将为各位小伙伴们带来CAD制图.工艺流程图等画法的相关内容,欢迎各位分享学习,提高绘图技术! 设备的画法与标注 设备 ...

最新文章

  1. JS中编写函数去除HTML标签,js函数获取html中className所在的内容并去除标签
  2. python 内部函数,以及lambda,filter,map等内置函数
  3. 微信在公众号增开了新广告位 这次是在图文消息头部
  4. MySQL 中的 FOUND_ROWS() 与 ROW_COUNT() 函数
  5. 微服务实践(五):微服务的事件驱动数据管理
  6. javq接口_Java的接口及实例
  7. Hi Windows Live Writer
  8. loop设备及losetup命令介绍[转]
  9. python匿名函数(lambda)
  10. oracle避免索引失效,Oracle优化你的查询--关于避免索引隐式失效
  11. php 公众号 群发,php实现微信公众号无限群发
  12. 缓存面试五连击(下篇)
  13. 手机只能上QQ不能看网页
  14. vue上线后图片不显示_解决Vue打包后访问图片/图标不显示的问题
  15. MySQL数据库怎么进行分库分表?
  16. npoi 设定视图为分页预览_NPOI导出EXCEL 打印设置分页及打印标题
  17. 图片怎么转换成PDF格式?这两种方法都可以实现转换
  18. 【docker概念和实践 1】 基本概念和组成原理
  19. redux与react-redux
  20. U3D-3D MAX Biped导出.fbx到Unity的Humanoid的骨架不匹配(Disable Triangle Pelvis, Enable Triangle Neck)

热门文章

  1. linux下查看emmc读写次数,通过串口命令查看EMMC擦写次数的三大方法
  2. mc幻想乡java_我的世界1.7.2幻想乡整合版下载_我的世界1.7.2东方幻想乡下载_游戏之家...
  3. SAP QM 含有HUM的检验批做UD时候的不同之处?
  4. 阿里巴巴人工智能实验室“黄”了
  5. SAP SD基础知识之销售模式
  6. 2020 年,人工智能和深度学习未来的五大趋势
  7. 如何构建识别图像中字符的自动程序?一文解读OCR与HTR
  8. 谷歌15个人工智能开源免费项目!开发者:懂了
  9. 2018 年,关于深度学习的 10 个预测
  10. Tensorflow— saver_save