爱上MVC系列~过滤器实现对响应流的处理
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系列~过滤器实现对响应流的处理相关推荐
- MVC系列1-MVC基础
终于决定写一个系列的文章了,最开始其实是准备写一下WPF的,因为我这两年一直在做WPF,对WPF的喜爱自然是无以言表.但是由于我所在的地区对WPF的普及不是很广泛,所以,被迫又开始做起来web,但是我 ...
- ASP.NET MVC的过滤器笔记
过滤器概念 APS.NET MVC中(以下简称"MVC")的每一个请求,都会分配给相应的控制器和对应的行为方法去处理,而在这些处理的前前后后如果想再加一些额外的逻辑处理.这时候就用 ...
- 请求流和响应流(复习笔记)
请求流和响应流 一: 使用响应流进行响应文件(数据,图片都可以) @GetMapping("/test")public void getRequestMap(HttpServlet ...
- ASP .NET Core Web MVC系列教程三:添加视图
系列文章目录:ASP .NET Core Web MVC系列教程:使用ASP .NET Core创建MVC Web应用程序 上一个教程:ASP .NET Core Web MVC系列教程二:添加控制器 ...
- ASP .NET Core Web MVC系列教程二:添加控制器
系列文章目录:ASP .NET Core Web MVC系列教程:使用ASP .NET Core创建MVC Web应用程序 上一个教程:ASP .NET Core Web MVC系列教程一:创建一个W ...
- netframework转core时文件响应流问题
做将framework webapi项目转成netcore平台上的webapi项目时,发现原来的返回文件响应流在netcore平台下失效.代码如下,返回pdf文件响应流,供前端显示 /// <s ...
- 「微服务系列 13」熔断限流隔离降级
我们知道微服务分布式依赖关系错综复杂,比方说前端的请求转化为后端调用的服务请求,一个前端请求会转为成很多个后端调用的服务请求,那么这个时候后台的服务出现不稳定或者延迟,如果没有好的限流熔断措施,可能会 ...
- (转)一步一步Asp.Net MVC系列_权限管理设计起始篇
原文地址:http://www.cnblogs.com/mysweet/archive/2012/07/26/2610793.html 前一段时间,写了一步一步asp.net的一系列博客,最近,也快要 ...
- MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理)(转)
阅读目录 一.MVC原理解析 1.MVC原理 二.HttpHandler 1.HttpHandler.IHttpHandler.MvcHandler的说明 2.IHttpHandler解析 3.Mvc ...
- 爱上MVC~业务层刻意抛出异常,全局异常的捕获它并按格式返回
对于业务层的程序的致命错误,我们一直的做法就是直接抛出指定的异常,让程序去终断,这种做法是对的,因为如果一个业务出现了致命的阻塞的问题,就没有必要再向上一层一层的返回了,但这时有个问题,直接抛异常,意 ...
最新文章
- thinkphp6集成JWT
- SpringMVC+Hibernate +MySql+ EasyUI实现POI导出Excel(二)
- javafx动画_JavaFX:创建Sprite动画
- merlin.acs的使用方法 merlin.acs添加右键菜单
- 百度分享新浪微博无法分享图片的解决方法
- Web前端笔记(4)
- 简单java数组程序_java(数组及常用简单算法 )
- img内联块元素的操作
- jeecg3.5的一个bug
- 程序员必知的Python陷阱与缺陷列表
- Vim插件合集 (打造你的专属炫酷IDE)
- 内存超频时序怎么调_超频讲解:内存时序设置一
- 使用CreatePen()创建自定义画笔
- ssm使用注解配置多数据源
- Milking Cows /// 区间计数 离散化排序 oj10105
- DHCP协议的运行过程
- Poisson 分布
- 大数据测试数据生成工具v1.0 --百万级别一键导出TXT,JSON,MYSQL 。---HIVE专属工具
- 基于正则表达式(python)对东方财富网上证指数吧爬虫实例
- 梆梆加固之防内存dump分析