ASP.NET WebAPI 14 仿写Filter管道
WebAPI中有设计了几种管道(Channel),大概如下:HttpMessageHandler,ActionFilter管道,ExceptionFilter管道。在三种管道中HttpMessageHandler管道与ExceptionFilter管道是基于级别设计的,ActionFilter管道是基于方法级别设计的。对于ActionFilter管道,因为采用的是AOP的思想,所以按方法级别去设计。
在看WebAPI源码过程中对ActionFilter管道中何用的表达示树与闭包等内容之前并没有下手写过,所以想仿写一个简单版的ActionFilter来练练手。
在写demo的过程中,我将Action的返回值固定为ResponseMessage,在ActionFilter实现过程中并没有遵循WebAPI的具体规则,只是实现ActionFilter对Action执行前后的切入与多ActionFilter的注入。
IActionFilter
public interface IActionFilter { Task<ResponseMessage> ExecuteActionFilterAsync(ActionContext actionContext, CancellationToken cancellationToken, Func<Task<ResponseMessage>> continuation); }
IActionFilter我是直接Copy源码里面的。IActionFilter接口,只定义了一个ExecuteActionFilterAsync方法。对于方法前两个参数好理解,至于最后一个类型为Func<Task<ResponseMessage>>的参数continuation,它是组成ActionFilter的关键。在WebAPI中将所有Action以及IActionFilter的ExecuteActionFilterAsync方法通过闭包的方式封装成Func<Task<ResponseMessage>>,再将每个Func<Task<ResponseMessage>逐级向ActionFilter中添加,以此来完成整个ActionFilter管道的构建。
Action到Func<Task<ResponseMessage>>
对于Action,因为我已经将返回值默认为ResponseMessage,所以我并没有对返回值做转换处理。因为Func<Task<ResponseMessage>>是一个无参的委托,所以在向Func<Task<ResponseMessage>>的转换分成两步:
- 定义类ActionInvoker(在demo中本身这个类并不是必须的,定义这个类主要是为是练习表达示树)
- 再针对ActionInvoker生成Func<Task<ResponseMessage>>
Func<Task<ResponseMessage>> result = () => { return invoker.Invoke(context, cancellationToken); };
通过闭包生成ActionFilter管道
之前已经提到将IActionFilter的ExecuteActionFilterAsync方法转换成Func<Task<ResponseMessage>>,并逐级添加到ActionFilter管道中,这个时候就必须要用到闭包了。
ActionInvoker invoker = new ActionInvoker(context.Action); Func<Task<ResponseMessage>> result = () => { return invoker.Invoke(context, cancellationToken); }; for (int i = 0; i <= filters.Count - 1; i++) { IActionFilter filter = filters[i]; Func<Func<Task<ResponseMessage>>, IActionFilter, Func<Task<ResponseMessage>>> chainContinuation = (continuation, innerFilter) => { return () => { return innerFilter.ExecuteActionFilterAsync(context, cancellationToken, continuation); }; }; result = chainContinuation(result, filter); }
对于这个仿写的ActionFilter相对来说比较简单,所以以后有时候的话看能不能把Exception管道加进来,同时按照WebAPI的ActionFilter管道的规则去处理。
源码
Github: https://github.com/BarlowDu/WebAPI (FilterChannelDemo)
ASP.NET WebAPI 14 仿写Filter管道的更多相关文章
- ASP.NET WebAPI 13 Filter
Filter(筛选器)是基于AOP(面向方面编程)的设计,它的作用是Actionr的执行注入额外的逻辑,以达到横切注入的目的. IFilter 在WebAPI中所以的Filter都实现了IFilter ...
- 细说Asp.Net WebAPI消息处理管道
我们在开发完Asp.Net WebAPI程序后,可以使用WebHost寄宿方式或者SelfHost寄宿方式来部署Asp.Net WebAPI.所谓WebHost寄宿就是通过Asp.Net来实现:所谓S ...
- ASP.NET WebAPI 08 Message,HttpConfiguration,DependencyResolver
ASP.NET WebAPI 08 Message,HttpConfiguration,DependencyResolver Message WebAPI作为通信架构必定包含包含请求与响应两个方法 ...
- ASP.NET WEBAPI 的身份验证和授权
定义 身份验证(Authentication):确定用户是谁. 授权(Authorization):确定用户能做什么,不能做什么. 身份验证 WebApi 假定身份验证发生在宿主程序称中.对于 web ...
- ASP.NET Core 2.0 : 八.图说管道
本文通过一张GIF动图来继续聊一下ASP.NET Core的请求处理管道,从管道的配置.构建以及请求处理流程等方面做一下详细的研究.(ASP.NET Core系列目录) 一.概述 上文说到,请求是经过 ...
- ASP.NET Core 2.0 : 八.图说管道,唐僧扫塔的故事
本文通过一张GIF动图来继续聊一下ASP.NET Core的请求处理管道,从管道的配置.构建以及请求处理流程等方面做一下详细的研究.(ASP.NET Core系列目录) 一.概述 上文说到,请求是经过 ...
- Asp.Net WebApi核心对象解析(下篇)
在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...
- 【开源】分享一个前后端分离方案-前端angularjs+requirejs+dhtmlx 后端asp.net webapi
一.前言 半年前左右折腾了一个前后端分离的架子,这几天才想起来翻出来分享给大家.关于前后端分离这个话题大家也谈了很久了,希望我这个实践能对大家有点点帮助,演示和源码都贴在后面. 二.技术架构 这两年a ...
- 让Asp.Net WebAPI支持OData查询,排序,过滤。
让Asp.Net WebAPI支持OData后,就能支持在url中直接输入排序,过滤条件了. 一.创建Asp.Net WebAPI项目: 二.使用NuGet安装Asp.Net WebAPI 2.2和O ...
随机推荐
- npoi与memcached中的ICSharpCode.SharpZipLib版本冲突的解决方案
项目中一直使用NPOI与memcached,一直相安无事,但是最近升级了npoi到最新版本,发生了ICSharpCode.SharpZipLib的版本冲突问题. 因为此前一直使用的是NPOI的1.x的 ...
- dnspod动态域名使用感受
继花生壳不能用之后,3322也开始不太好用了,首先就是360把所有3322的域名全部判定为危险域名,甚至拦截程序对于3322url的api请求. 所以想把3322换成我们自己的独立域名,但是3322他 ...
- iis 访问网站需要进行身份验证
今天网站输入域名访问的时候提示需要输入账号密码,这是权限出了问题,百度了一下,解决了,分享一下: 1.登陆远程,右键我的电脑->管理->本地用户和组->用户,里面有一个IUSR_WD ...
- android自定义view仿照MIUI中音量控制效果
先看效果图: 这就是miui中的音量效果图,实现思路是自定义视图,绘制圆环,然后设置进度显示. 核心代码在onDraw中实现如下: @Override protected void onDraw(Ca ...
- Science上发表的超赞聚类算法
本博客已经迁往http://www.kemaswill.com/, 博客园这边也会继续更新, 欢迎关注~ 作者(Alex Rodriguez, Alessandro Laio)提出了一种很简洁优美的聚 ...
- POJ 1816 Wild Words
Wild Words Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4412 Accepted: 1149 Descri ...
- Vbox如何修改虚拟机器的uuid
先是 X: 然后cd X:\Program Files\VirtualBox 然后是 VBoxManage internalcommands sethduuid "X:\Progra ...
- WebKit内核分析之Page
参考地址:http://blog.csdn.net/dlmu2001/article/details/6213377 注:本系列博客是在原博主博客基础上增加了自己的理解和片段,可以看源博文获得清晰的结 ...
- Codeforces Perfect Pair (JAVA)
http://codeforces.com/problemset/problem/317/A 题意:给两个数字,可以两数相加去替换其中一个数字.问要做多少次,可以让两个数字钟至少一个 >= 目标 ...
- hbase 使用
hbase shell命令的使用 再使用hbase 命令之前先检查一下hbase是否运行正常 hadoop@Master:/usr/hbase/bin$ jps HMaster NameNode Se ...