MVC的过滤器相信大家都用过,一般用来作权限控制,因为它可以监视你的Action从进入到最后View的渲染,整个过程ActionFilter这个过滤器都参与了,而这给我们的开发带来了更多的好处,如你可以在进行页面上进行权限的判断,在页面渲染前修改页面的内容,而第二个功能,就是我们今天要说的。

解决实际问题

今天出现一个问题,在webapi向手机端返回数据时,手机端不能正常解析全角的标点符号,英半角英文符号是可以正确解析的,这时我有了一个想法,就是在页面输出之前,对它进行处理,将全角符号替换成半角的,而这个功能你不可能写在每个Action里,这对任何人来说都是一件悲惨的事,所以,ActionFilter出来了,让它自动去监视,帮我们解决问题吧!

先看一下全局过滤器的配置

    /// <summary>/// 全局过滤器的配置/// </summary>public class FilterConfig{/// <summary>/// 注册全局的过滤器/// </summary>/// <param name="filters"></param>public static void RegisterGlobalFilters(GlobalFilterCollection filters){filters.Add(new HandleErrorAttribute());//响应流处理程序Func<string, string> aa = (str) =>{return str.Replace("(", "[").Replace(")", "]");};//添加响应流过滤器filters.Add(new ResponseFilter(aa));}}

下面是ResponseFilter的代码,主要实现了对响应流的重写,注意,你必须在页面渲染前进行处理,当页面渲染后,你无法对响应流修改,因为这时的流是只读流

我的ResponseFilter提供了一个Func的委托,就是让开发人员都自己的处理策略进行自定义,这样有效的提高了代码的重复利用性,如果把处理逻辑写在过滤器里,那么你的这个响应过滤器就被写死了,无法扩展和复用

 /// <summary>/// Http响应流过滤器,对它进行加工/// </summary>public class ResponseFilter : ActionFilterAttribute{/// <summary>/// 输出流处理程序/// </summary>Func<string, string> _process;#region Contructorspublic ResponseFilter(): this(null){}public ResponseFilter(Func<string, string> process){this._process = process;}#endregion#region Override Methods/// <summary>/// action执行前/// </summary>/// <param name="filterContext"></param>public override void OnActionExecuting(ActionExecutingContext filterContext){base.OnActionExecuting(filterContext);}/// <summary>/// view页面渲染前/// </summary>/// <param name="filterContext"></param>public override void OnResultExecuting(ResultExecutingContext filterContext){base.OnResultExecuting(filterContext);}/// <summary>/// view页面渲染后/// </summary>/// <param name="filterContext"></param>public override void OnResultExecuted(ResultExecutedContext filterContext){base.OnResultExecuted(filterContext);}/// <summary>/// action执行后/// 在这里修改输出流/// </summary>/// <param name="filterContext"></param>public override void OnActionExecuted(ActionExecutedContext filterContext){if (filterContext.Result.GetType() == typeof(JsonResult)){var aa = ((System.Web.Mvc.JsonResult)(filterContext.Result)).Data;JavaScriptSerializer jss = new JavaScriptSerializer();var str = jss.Serialize(aa);if (this._process != null){//处理输出流str = this._process(str);((System.Web.Mvc.JsonResult)(filterContext.Result)).Data = jss.Deserialize<object>(str);}}if (filterContext.Result.GetType() == typeof(ContentResult)){((System.Web.Mvc.ContentResult)(filterContext.Result)).Content += "大叔";}base.OnActionExecuted(filterContext);}#endregion}

感谢您的阅读,也感谢对仓储大叔的支持!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:爱上MVC系列~过滤器实现对响应流的处理,如需转载请自行联系原博主。

爱上MVC系列~过滤器实现对响应流的处理相关推荐

  1. MVC系列1-MVC基础

    终于决定写一个系列的文章了,最开始其实是准备写一下WPF的,因为我这两年一直在做WPF,对WPF的喜爱自然是无以言表.但是由于我所在的地区对WPF的普及不是很广泛,所以,被迫又开始做起来web,但是我 ...

  2. ASP.NET MVC的过滤器笔记

    过滤器概念 APS.NET MVC中(以下简称"MVC")的每一个请求,都会分配给相应的控制器和对应的行为方法去处理,而在这些处理的前前后后如果想再加一些额外的逻辑处理.这时候就用 ...

  3. 请求流和响应流(复习笔记)

    请求流和响应流 一: 使用响应流进行响应文件(数据,图片都可以) @GetMapping("/test")public void getRequestMap(HttpServlet ...

  4. ASP .NET Core Web MVC系列教程三:添加视图

    系列文章目录:ASP .NET Core Web MVC系列教程:使用ASP .NET Core创建MVC Web应用程序 上一个教程:ASP .NET Core Web MVC系列教程二:添加控制器 ...

  5. ASP .NET Core Web MVC系列教程二:添加控制器

    系列文章目录:ASP .NET Core Web MVC系列教程:使用ASP .NET Core创建MVC Web应用程序 上一个教程:ASP .NET Core Web MVC系列教程一:创建一个W ...

  6. netframework转core时文件响应流问题

    做将framework webapi项目转成netcore平台上的webapi项目时,发现原来的返回文件响应流在netcore平台下失效.代码如下,返回pdf文件响应流,供前端显示 /// <s ...

  7. 「微服务系列 13」熔断限流隔离降级

    我们知道微服务分布式依赖关系错综复杂,比方说前端的请求转化为后端调用的服务请求,一个前端请求会转为成很多个后端调用的服务请求,那么这个时候后台的服务出现不稳定或者延迟,如果没有好的限流熔断措施,可能会 ...

  8. (转)一步一步Asp.Net MVC系列_权限管理设计起始篇

    原文地址:http://www.cnblogs.com/mysweet/archive/2012/07/26/2610793.html 前一段时间,写了一步一步asp.net的一系列博客,最近,也快要 ...

  9. MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理)(转)

    阅读目录 一.MVC原理解析 1.MVC原理 二.HttpHandler 1.HttpHandler.IHttpHandler.MvcHandler的说明 2.IHttpHandler解析 3.Mvc ...

  10. 爱上MVC~业务层刻意抛出异常,全局异常的捕获它并按格式返回

    对于业务层的程序的致命错误,我们一直的做法就是直接抛出指定的异常,让程序去终断,这种做法是对的,因为如果一个业务出现了致命的阻塞的问题,就没有必要再向上一层一层的返回了,但这时有个问题,直接抛异常,意 ...

最新文章

  1. thinkphp6集成JWT
  2. SpringMVC+Hibernate +MySql+ EasyUI实现POI导出Excel(二)
  3. javafx动画_JavaFX:创建Sprite动画
  4. merlin.acs的使用方法 merlin.acs添加右键菜单
  5. 百度分享新浪微博无法分享图片的解决方法
  6. Web前端笔记(4)
  7. 简单java数组程序_java(数组及常用简单算法 )
  8. img内联块元素的操作
  9. jeecg3.5的一个bug
  10. 程序员必知的Python陷阱与缺陷列表
  11. Vim插件合集 (打造你的专属炫酷IDE)
  12. 内存超频时序怎么调_超频讲解:内存时序设置一
  13. 使用CreatePen()创建自定义画笔
  14. ssm使用注解配置多数据源
  15. Milking Cows /// 区间计数 离散化排序 oj10105
  16. DHCP协议的运行过程
  17. Poisson 分布
  18. 大数据测试数据生成工具v1.0 --百万级别一键导出TXT,JSON,MYSQL 。---HIVE专属工具
  19. 基于正则表达式(python)对东方财富网上证指数吧爬虫实例
  20. 梆梆加固之防内存dump分析

热门文章

  1. bzoj 2623 所罗门的咒语
  2. python dictionay(字典 )基本用法
  3. 在Java中使用Rserve调用R
  4. linux内核之进程调度
  5. Linux设备驱动之字符设备(一)
  6. linux开机时驱动的加载流程
  7. 抓包工具tcpdump的使用总结(持续更新)
  8. android camera API1调用camera HAL3流程学习总结
  9. freeswitch modules 模块
  10. .jar文件参与android源码编译