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 ...
随机推荐
- Domain Space
Bluehost Register Page http://www.bluehost.com/track/weipengp
- led显字风扇原理?
神奇的是上面的图案居然会变,十分好奇,求告知原理?? 其实就是依靠转速计算出LED灯变化的频率.这点和老式CRT的显示原理差不多.比如说风扇的转速时60rpm就是每分钟60圈,每秒1圈(当然实际转速快 ...
- DevExpress XtraTreeList的复选框 禁用
树的2个事件代码如下,通过节点的tag判断是否禁用节点前的复选框.树的节点加载时设置要禁用的节点tag为-1,不禁用的则设为相关的值 private void treeListPer_CustomDr ...
- datagrid 动态列
var options={}; $(function(){ var myNj = 9; //初始化 $("#disgrid").datagrid({ type: 'POST', n ...
- 图文详解远程部署ASP.NET MVC 5项目 [转载]
话外篇: 由于感觉自己的机器比较慢,配置不好,所以最近想把之前的项目部署到实验室的服务器上,但是由于常不在实验室,所以在想能不能远程部署.因此今天专门研究了一下具体的过程,下面和大家分享一下.本人新手 ...
- 推荐一款炫酷的提示框插件SweetAlert
官方网址 http://t4t5.github.io/sweetalert/ 项目地址 https://github.com/t4t5/sweetalert
- 托管调试助手“NonComVisibleBaseClass”检测到问题
最近 一次在研究 自动化测试框架White ,程序总是报 “托管调试助手“NonComVisibleBaseClass”在“d:\xxxxxxxxxx.vshost.exe”中检测到问题.” 其他 ...
- maven -- 问题解决(一)解决eclipse中maven项目出现的问题
配置项目时出现的错误: error: Cannot change version of project facet Dynamic Web Module to 2.5. error: One or m ...
- grunt压缩多个js文件和css文件
压缩前的工程目录: 1.安装js,css需要的插件 使用npm安装:npm install grunt-contrib-uglify --save-dev -------->安装js压缩插件 ...
- 二叉堆(一)之 图文解析 和 C语言的实现
概要 本章介绍二叉堆,二叉堆就是通常我们所说的数据结构中"堆"中的一种.和以往一样,本文会先对二叉堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本 ...