filter的介绍

filter在Web API中经常会用到,主要用于记录日志,安全验证,全局错误处理等;Web API提供两种过滤器的基本类型:actionfilterattribute,exceptionfilterattribute;两个类都是抽象类,actionfilter主要实现执行请求方法体之前(覆盖基类方法OnActionExecuting),和之后的事件处理(覆盖基类方法OnActionExecuted);exceptionfilter主要实现触发异常方法(覆盖基类方法OnException)。下面对前者类型做示例。

新建ActionFilter类

打印参数、返回值、以及接口响应时间:

  1. public class ActionFilter : ActionFilterAttribute
  2. {
  3. private const string Key = "action";
  4. private bool _IsDebugLog = true;
  5. public override void OnActionExecuting(HttpActionContext actionContext)
  6. {
  7. if (_IsDebugLog)
  8. {
  9. Stopwatch stopWatch = new Stopwatch();
  10.  
  11. actionContext.Request.Properties[Key] = stopWatch;
  12.  
  13. string actionName = actionContext.ActionDescriptor.ActionName;
  14.  
  15. Debug.Print(Newtonsoft.Json.JsonConvert.SerializeObject(actionContext.ActionArguments));
  16.  
  17. stopWatch.Start();
  18. }
  19.  
  20. }
  21. public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
  22. {
  23. if (_IsDebugLog)
  24. {
  25. Stopwatch stopWatch = actionExecutedContext.Request.Properties[Key] as Stopwatch;
  26.  
  27. if (stopWatch != null)
  28. {
  29.  
  30. stopWatch.Stop();
  31.  
  32. string actionName = actionExecutedContext.ActionContext.ActionDescriptor.ActionName;
  33.  
  34. string controllerName = actionExecutedContext.ActionContext.ActionDescriptor.ControllerDescriptor.ControllerName;
  35.  
  36. Debug.Print(actionExecutedContext.Response.Content.ReadAsStringAsync().Result);
  37.  
  38. Debug.Print(string.Format(@"[{0}/{1} 用时 {2}ms]", controllerName, actionName, stopWatch.Elapsed.TotalMilliseconds));
  39. }
  40. }
  41. }
  42.  
  43. }

在接口的action方法上添加过滤器

[ActionFilter]

或者将过滤器添加到配置中,这样将相当于在每个接口上添加了过滤器

演示

发送请求:

接口响应:

 
 

【C#】WebApi 添加过滤器,实现对请求参数和响应内容的日志记录的更多相关文章

  1. Fiddler插件 --- 解密Elong Mapi请求参数及响应内容

    当前问题: 在我们日常的Web/App测试过程中, Fiddler是一大辅助利器:在我们团队,也经常使用Fiddler进行App抓包测试. 艺龙 App使用的REST(内部称为Mapi)接口,在使用过 ...

  2. springboot springmvc拦截器 拦截POST、PUT、DELETE请求参数和响应数据,并记录操作日志

    1.操作日志实体类 @Document(collection = "operation_log") @Getter @Setter @ToString public class O ...

  3. WebApi中对请求参数和响应内容进行URL编码解码

    项目经测试,发现从IE提交的数据,汉字会变成乱码,实验了网上很多网友说的给ajax加上contentType:"application/x-www-form-urlencoded; char ...

  4. SpringMVC请求参数和响应结果全局加密和解密

    前提 前段时间在做一个对外的网关项目,涉及到加密和解密模块,这里详细分析解决方案和适用的场景.为了模拟真实的交互场景,先定制一下整个交互流程.第三方传输(包括请求和响应)数据报文包括三个部分: 1.t ...

  5. Jmeter beanshell preprocessor随机添加任意多个请求参数

    介绍下本次使用beanshell preprocessor的原因: 1.系统下可添加产品,一个产品可以有多个产品主题(比如:产品A(杭州三日游)拥有三个主题(研学.红学.夏令营)),我们在每次添加产品 ...

  6. 如何在Asp.Net WebApi接口中,验证请求参数中是否携带token标识!

    [BasicAuthentication] public abstract class ApiControllerBase : ApiController { #region Gloal Proper ...

  7. ???SpringMVC_03 利用SpringMVC提供的过滤器解决浏览器请求参数的乱码问题

    1 响应乱码问题 在启用mvc注解的配置中添加一个转换器配置 <?xml version="1.0" encoding="UTF-8"?> < ...

  8. webapi filter过滤器中获得请求的方法详情(方法名,Attributes)

    public class GlobalActionFilter : ActionFilterAttribute { private string _requestId; public override ...

  9. 使用java的自定义过滤器Filter 处理请求request 并响应response

    package com.enation.eop; import java.io.BufferedReader; import java.io.IOException; import java.io.I ...

随机推荐

  1. centos6下安装php7的memcached扩展

    安装php7的memcached扩展 .编译安装libmemcached- wget https://launchpadlibrarian.net/165454254/libmemcached-1.0 ...

  2. mysql多表关联update修改操作

      UPDATE province_yunnan_salary s1 JOIN province_guangdong_salary s2 ON s1.user_name= s2.user_name S ...

  3. 前端 -----jQuery的选择器

    02-jQuery的选择器   我们以前在CSS中学习的选择器有: 今天来学习一下jQuery 选择器. jQuery选择器是jQuery强大的体现,它提供了一组方法,让我们更加方便的获取到页面中的元 ...

  4. 【原创】大叔经验分享(29)cdh5使用已存在的metastore数据库部署hive

    cdh5.16.1使用的hive版本是hive-1.1.0+cdh5.16.1+1431,详见:https://www.cloudera.com/documentation/enterprise/re ...

  5. Java替换中使用正则表达式实现中间模糊匹配

    使用“.+?”实现中间模糊匹配的代码: public class Test { public static void main(String[] args) { String str="总会 ...

  6. ActiveMQ-为什么需要消息中间件?

    消息中间件的优势 UNIX的进程间通信就开始运用消息队列技术,一个进程将数据写入某个特定的队列中,其它进程可以读取队列中的数据,从而实现异步通信.对于如今的分布式系统,消息队列已经演变为独立的消息中间 ...

  7. python-进程池与线程池,协程

    一.进程池与线程池 实现并发的手段有两种,多线程和多进程.注:并发是指多个任务看起来是同时运行的.主要是切换+保存状态. 当我们需要执行的并发任务大于cpu的核数时,我们需要知道一个操作系统不能无限的 ...

  8. AndroidManifest.xml 最全详解

    AndroidManifest.xml 是每个android程序中必须的文件,它位于整个项目的根目录.我们每天都在使用这个文件,往里面配置程序运行所必要的组件,权限,以及一些相关信息.但是对于这个文件 ...

  9. C#简单画图程序

    实现过程: (1) 新建窗体应用程序 (2) 添加一个MenuScrip控件:添加一个ToolScrip控件. 在ToolScrip控件中对每个单元,要将DisplayStyle属性改为Text (3 ...

  10. 终于,我还是下决心学Java后台了

    我没有什么本事,人也丑,也不会忽悠,只能硬着头皮学习了.最近计划学习Java后台,因为最近接了私活的问题,好多都要Java后台和前端一起做.平常我在做什么,当然是忙着赚钱了 除了敲代码,你还有什么副业 ...