web api 开发之 filter
1、使用filter之前应该知道的(不知道也无所谓,哈哈!)
谈到filter 不得不先了解下aop(Aspect Oriented Programming)面向切面的编程。(度娘上关于aop一大堆我就不在这废话了)
下面是个人理解对aop理解(不要板砖): 以前面向过程的编程,某个功能都编写成函数,在需要的时候调用。而面向对象中的编码和设计中,在类中的某个点(或者说是一个横向的切面)去实现一个功能的时候,大家也想实面向过程编码中那样简单的调用(当然不是这么简答,就是打个比方),把实例化类等繁琐的工作交给了系统去做,哈哈aop就出现了!
web api 提供两种过滤器的基本类型 :
1)actionfilterattribute
2)exceptionfilterattribute
两个类都是抽象类,actionfilter主要实现执行请求方法体之前(覆盖基类方法OnActionExecuting),和之后的事件处理(覆盖基类方法OnActionExecuted)。 exceptionfilter主要实现触发异常方法(覆盖基类方法OnException)。
过滤器在实际项目中都是经常会使用到,例如日志、安全验证、全局错误处理等等。
2、实际使用中遇到的问题
1)问题一 filter触发不了
写了一个filter的例子,继承actionfilterattribute,死活触发不了!呵呵,搞了半天后来才搞明白,filter 继承了mvc4的。
原来webapi 在system.web.http命名空间下,mvc在System.web.mvc下,两个空间都有filter,不知道怎么搞得,继承mvc的了,呵呵!
2)问题二 在action执行前取数据,如果有二个filter,第二个取不到请求消息体数据
需求是这 样的要写二个过滤器,都应用在同一个方法上,第一个取请求http消息体正常,但是第二个再取就是空了?
action
[FilterAttribute1]
[FilterAttribute2]
public MessageResponse Post(MessageRequest messagerequest)
{
//方法体信息
................
}
filter
//处理功能1
public class FilterAttribute1 : ActionFilterAttribute
{
public async override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
{
base.OnActionExecuting(actionContext);
//获取请求消息提数据
Stream stream = await actionContext.Request.Content.ReadAsStreamAsync();
Encoding encoding = Encoding.UTF8;
stream.Position = ;
string responseData = "";
using (StreamReader reader = new StreamReader(stream, encoding))
{
responseData = reader.ReadToEnd().ToString();
} //然后反序列化进行处理
..................
}
public async override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
base.OnActionExecuted(actionExecutedContext);
//获取返回消息数据
var response =
await
actionExecutedContext.Response.Content.ReadAsAsync(
actionExecutedContext.ActionContext.ActionDescriptor.ReturnType);
} }
//处理功能2
public class FilterAttribute2 : ActionFilterAttribute
{
public async override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
{
base.OnActionExecuting(actionContext);
//获取请求消息提数据
Stream stream = await actionContext.Request.Content.ReadAsStreamAsync();
//在这stream值是空的。
Encoding encoding = Encoding.UTF8;
stream.Position = ;
string responseData = "";
using (StreamReader reader = new StreamReader(stream, encoding))
{
responseData = reader.ReadToEnd().ToString();
} //然后反序列化进行处理
.................. } }
始终没有想没那个白,为什么第二个filter取不到?请教前辈有的说当第一个stream 取完,流关闭了,所以取不到,有的说第一个取后,加锁了.....等等,到现在我还是没有搞明白到底是为什么,还好找到解决方法,代码总算是可以王下写。换了一种思路,从actionContext中找到了取得输入参数的方法,正好是所需要的请求消息数据。实现如下
//修改后,后边filter数据照常取出,问题解决
public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
{
base.OnActionExecuting(actionContext);
string responsemessagebody = ""; Dictionary<string, object> actionargument = actionContext.ActionArguments; foreach (KeyValuePair<string, object> arg in actionargument )
{
//每天action的消息体不同可以tostring,然后处理
responsemessagebody += arg.ToString();
//请求消息体相同
可以直接使用
(typeobject)arg 直接使用
}
........... }
3、总结一下还有些需要注意
1)在action执行前终止请求时,应该使用填充方法Response,将不返回action方法体。
例如:当验证判断不合法时,返回错误信息而不再继续执行action代码。
代码如下:
web api 开发之 filter的更多相关文章
- Web API中常用Filter的执行顺序举例讲解
在WEB Api中,引入了面向切面编程(AOP)的思想,在某些特定的位置可以插入特定的Filter进行过程拦截处理.引入了这一机制可以更好地践行DRY(Don’t Repeat Yourself)思想 ...
- [Asp.Net web api]基于自定义Filter的安全认证
摘要 对第三方开放的接口,处于安全的考虑需要对其进行安全认证,是否是合法的请求.目前在项目中也遇到这种情况,提供的接口因为涉及到客户铭感数据,所以在调用的时候,不能直接暴露,需要有一个认证的机制.所以 ...
- 十一、springboot之web开发之Filter
我们常常在项目中会使用filters用于录调用日志.排除有XSS威胁的字符.执行权限验证等等.Spring Boot自动添加了OrderedCharacterEncodingFilter和Hidden ...
- SpringBoot | 第十九章:web应用开发之WebSocket
前言 web开发也讲解了三章了,这章节开始讲解关于与前端通信相关知识.实现一个在线聊天室类似的功能或者后端推送消息到前端,在没有WebSocket时,读大学那伙还有接触过DWR(Direct Web ...
- 二十二、【轻量级开源框架】EFW框架Web前端开发之JqueryEasyUI
回<[开源]EFW框架系列文章索引> EFW框架源代码下载V1.2:http://pan.baidu.com/s/1hcnuA EFW框架实例源代码下载:http://pan ...
- SpringBoot | 第十八章:web应用开发之WebJars使用
前言 前面一章节我们主要讲解了关于文件上传的两种方式.本章节继续web开发的相关知识点.通常对于web开发而言,像js.css.images等静态资源版本管理是比较混乱的,比如Jquery.Boots ...
- web app开发之rem
CSS3新增了一个相对单位rem,官方的解释为“font size of the root element”,相对于根元素(html)的font size. rem,em,px单位的区别: rem单位 ...
- Android学习笔记----天地图API开发之UnsatisfiedLinkError
由于在jniLibs目录下移除了x86的相关so文件,后来又因为需要在PC模拟器上调试,将该文件夹恢复后,增加了天地图的sdk,却忘记将libMapEngine.so文件同时拷贝至x86目录下,导致如 ...
- 指尖下的js ——多触式web前端开发之二:处理简单手势(转)
这篇文章将描述多触式网页开发中对手势(Gesture)事件的处理. 水果设备中的Gesture,广义的说包括手指点击(click),轻拂(flick),双击(double-click),两只手 ...
随机推荐
- JavaScript之面向对象学习四原型对象的动态性
1.由于在原型中查找值的过程是一次搜索,因此我们对原型对象所做的任何修改都能够立即从实例上反映出来---即便是先创建了实例后修改原型也是如此.代码如下: function Person(){ } va ...
- HTML5新增加的功能
1.部分代码代替了以前的代码 例如: 获取焦点 旧:document.getElementById("price");.focus; 新:<input ...
- c# 第三方控件 闪退
使用了第三方控件之后 出现了闪退的情况! 该第三方控件的软件没有注册或没有安装改第三方控件的软件
- matlab改变GUI和figure左上角图标的方法,并生成exe文件
1. GUI左上角图标的更改,假设GUI的Tag为figure1,在其OpeningFcn里添加h = handles.figure1; %返回其句柄newIcon = javax.swing.Ima ...
- C#委托的简单剖析
为什么在Button1的Click事件发生之后,button1_Click方法就会被调用呢? 实际上,在我们双击Button1的时候,IDE自动的添加了一段代码,该段代码位于“Form1.Design ...
- 深刻理解一句js
最近有点小懒,不想写东西,也不想看东西,看东西还老跑神,这是肿么了呢? 盯着显示器某一刻能把它看透,就是不想挪下眼睛 无意中看到了这行代码 [].forEach.call($$("*&quo ...
- 阿里云ECS每天一件事D7:安装tomcat8.0
这一D,跨越了几个月啊,人是越来越懒,集中写一些,就懒得再记录了.也是因为测试需要,搭建个jsp的服务环境,只是测试,考虑用tomcat就够了. 在Tomcat官网下载最新Core版本,下载之后,将文 ...
- why-and-howto-calculate-your-events-per-second
http://eromang.zataz.com/2011/04/12/why-and-howto-calculate-your-events-per-second/
- java selenium webdriver实战 页面元素定位
自动化测试实施过程中,测试程序中常用的页面操作有三个步骤 1.定位网页上的页面元素,并存储到一个变量中 2.对变量中存储的页面元素进行操作,单击,下拉或者输入文字等 3.设定页面元素的操作值,比如,选 ...
- UVA 11475 Extend to Palindrome(后缀数组+ST表)
[题目链接] http://acm.hust.edu.cn/vjudge/problem/27647 [题目大意] 给出一个字符串,要求在其后面添加最少的字符数,使得其成为一个回文串.并输出这个回文串 ...