【干货】.NET WebApi HttpMessageHandler管道
消息拦截器是一个类,接收 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管道相关推荐
- mysql数据库插入datetime_往MySQL数据库datetime类型字段中插入数据库的当前时间
代码: StringBuilder sb = new StringBuilder(); sb.append(" insert into uosdetailfile ("); sb. ...
- Java实现短信验证码最佳实践
1.背景 2.实现 3.运行效果: 4.源码 5.总结 1.背景 年初,从外地转移阵地到西安,转眼已两个多月.很久不写业务代码了,到了新公司,条件恶劣到前所未有,从需求,设计,架构,实现,实施,测试, ...
- qt程序卡死 linux,QtCreator中打开.ui文件时卡死崩溃的解决方法
用Java实现单链表的基本操作 笔试题中经常遇到单链表的考题,下面用java总结一下单链表的基本操作,包括添加删除节点,以及链表转置. package mars; //单链表添加,删除节点 publi ...
- Dotnet Core IHttpClientFactory深度研究
今天,我们深度研究一下IHttpClientFactory. 一.前言 最早,我们是在Dotnet Framework中接触到HttpClient. HttpClient给我们提供了与HTTP交互 ...
- 短信验证码“最佳实践”
1.背景 年初,从外地转移阵地到西安,转眼已两个多月.很久不写业务代码了,到了新公司,条件恶劣到前所未有,从需求,设计,架构,实现,实施,测试,bug修复,项目计划制定,项目管理,全他妈我一个人,关键 ...
- ASP.NET Web API 入门 (API接口、寄宿方式、HttpClient调用)
一.ASP.NET Web API接口定义 ASP.NET Web API默认实现了Action方法和HTTP方法的映射,Action方法方法名体现了其能处理的请求必须采用的HTTP方法 二.寄宿方式 ...
- DDD实战11 在项目中使用JWT的token 进行授权验证
步骤: 1.首先要在webapi的管道中 使用认证(Authentication) 2.要在webapi的服务中注册验证条件 代码如下: namespace Dealer.WebApi {public ...
- 《ASP.NET Web API 2框架揭秘》
<ASP.NET Web API 2框架揭秘> 基本信息 作者: 蒋金楠 出版社:电子工业出版社 ISBN:9787121235368 上架时间:2014-7-5 出版日期:2014 年7 ...
- horizon流程图_仪表、管道、阀门等化工工艺流程图的设计及画法,超多干货,等您来收!...
原标题:仪表.管道.阀门等化工工艺流程图的设计及画法,超多干货,等您来收! 小编本次将为各位小伙伴们带来CAD制图.工艺流程图等画法的相关内容,欢迎各位分享学习,提高绘图技术! 设备的画法与标注 设备 ...
最新文章
- JS中编写函数去除HTML标签,js函数获取html中className所在的内容并去除标签
- python 内部函数,以及lambda,filter,map等内置函数
- 微信在公众号增开了新广告位 这次是在图文消息头部
- MySQL 中的 FOUND_ROWS() 与 ROW_COUNT() 函数
- 微服务实践(五):微服务的事件驱动数据管理
- javq接口_Java的接口及实例
- Hi Windows Live Writer
- loop设备及losetup命令介绍[转]
- python匿名函数(lambda)
- oracle避免索引失效,Oracle优化你的查询--关于避免索引隐式失效
- php 公众号 群发,php实现微信公众号无限群发
- 缓存面试五连击(下篇)
- 手机只能上QQ不能看网页
- vue上线后图片不显示_解决Vue打包后访问图片/图标不显示的问题
- MySQL数据库怎么进行分库分表?
- npoi 设定视图为分页预览_NPOI导出EXCEL 打印设置分页及打印标题
- 图片怎么转换成PDF格式?这两种方法都可以实现转换
- 【docker概念和实践 1】 基本概念和组成原理
- redux与react-redux
- U3D-3D MAX Biped导出.fbx到Unity的Humanoid的骨架不匹配(Disable Triangle Pelvis, Enable Triangle Neck)
热门文章
- linux下查看emmc读写次数,通过串口命令查看EMMC擦写次数的三大方法
- mc幻想乡java_我的世界1.7.2幻想乡整合版下载_我的世界1.7.2东方幻想乡下载_游戏之家...
- SAP QM 含有HUM的检验批做UD时候的不同之处?
- 阿里巴巴人工智能实验室“黄”了
- SAP SD基础知识之销售模式
- 2020 年,人工智能和深度学习未来的五大趋势
- 如何构建识别图像中字符的自动程序?一文解读OCR与HTR
- 谷歌15个人工智能开源免费项目!开发者:懂了
- 2018 年,关于深度学习的 10 个预测
- Tensorflow— saver_save