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 ...
随机推荐
- js 与或运算符 || && 妙用
js 与或运算符 || && 妙用,可用于精简代码,降低程序的可读性. 首先出个题: 如图: 假设对成长速度显示规定如下: 成长速度为5显示1个箭头: 成长速度为10显示2个箭头: ...
- Fabric自动部署太方便了
之前不知道有Fabric工具,每次发布程序到服务器上的时候,基本流程:本地打包程序 -> Ftp上传 -> 停服务器Apache -> 覆盖文件 -> 启动Apache, 非常 ...
- LintCode-- Remove Linked List Elements
Remove all elements from a linked list of integers that have valueval. 样例 Given 1->2->3->3- ...
- java之final关键字
final关键字(可以读不可以写.只读) 1.final的变量的值不能够被改变 ①.final的成员变量 ②.final的局部变量(形参) //意思是“实参”一旦传进我的方法里面,就不允许改变 2.f ...
- 节日EDM系列:圣诞节如何进行EDM数据营销
消费关系升级,消费者看中的早已不是产品本身,场景消费以及消费带来的价值感体验已成为影响消费的重要因素.圣诞将至,如何才能将圣诞节EDM数据营销的效果发挥到极致? ① 节日元素创意融合,高辨识度加深品 ...
- 突破GFW,使用node.js
原文链接:https://cnodejs.org/topic/4f9904f9407edba21468f31e 这个也是网上搜的,亲自试过,非常好用! 镜像使用方法(三种办法任意一种都能解决问题,建议 ...
- struts2整合CKEditor和CKFinder实现上传
上一篇文章给大家分享了CKEditor+CKFinder+JSP实现了在线编辑器上传图片的功能,这里在给大家分享一下如何在前面的基础上在struts2下实现这样的功能. 实现与Struts2的整合,整 ...
- 【PRML读书笔记-Chapter1-Introduction】1.5 Decision Theory
初体验: 概率论为我们提供了一个衡量和控制不确定性的统一的框架,也就是说计算出了一大堆的概率.那么,如何根据这些计算出的概率得到较好的结果,就是决策论要做的事情. 一个例子: 文中举了一个例子: 给定 ...
- win7左ctrl和左alt键互换
主要参考这篇文章: http://xyztony1985.blog.163.com/blog/static/3611782011752420104/ 感谢原博主 Windows Registry Ed ...
- MongoDB的学习--文档的查询
继续关于<MongoDB权威指南>记录,今天的内容是文档的查询~~ MongoDB官网地址:http://www.mongodb.org/ 我使用的是MongoDB 2.4.8 find函 ...