爱上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 Contructors
public 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系列~过滤器实现对响应流的处理的更多相关文章
- WebApi系列~对HttpClient的响应流进行解压
回到目录 有时我们的请求头为ContentEncoding添加了gzip进行了压缩,而服务端返回数据时也会对它进行gzip压缩,如果在这种情况下,你直接头响应流会是乱码,而必须先进行压缩,大叔将这块的 ...
- 爱上MVC系列~带扩展名的路由失效问题
回到目录 对MVC中,对URL进行重写变得非常方便,你只要设置相应的路由规则即可完成,但进行MVC3后,发现设置了以下路由,系统具体不认 routes.MapRoute( name: "De ...
- 爱上MVC系列~前端验证与后端数据有效性验证
回到目录 有一句话,在10年前就是真理,到现在也一直都是,“前端验证可以没有,但后端验证必须要有”,这句话相信大家都没有意见吧,前端验证一般指通过JS方式实现的,友好的,个性的验证方式,而后端验证是指 ...
- 笨鸟先飞之ASP.NET MVC系列之过滤器(01过滤器简介)
过滤器 什么是过滤器? 过滤器(Filter) 主要的作用大致可以理解为把我们的附加逻辑注入到MVC框架的请求处理. 在ASP.NET MVC的请求处理中一种有19个管道事件分别是 BeginRequ ...
- MVC系列——MVC源码学习:打造自己的MVC框架(四:了解神奇的视图引擎)
前言:通过之前的三篇介绍,我们基本上完成了从请求发出到路由匹配.再到控制器的激活,再到Action的执行这些个过程.今天还是趁热打铁,将我们的View也来完善下,也让整个系列相对完整,博主不希望烂尾. ...
- MVC系列1-MVC基础 (ASP.NET)
终于决定写一个系列的文章了,最开始其实是准备写一下WPF的,因为我这两年一直在做WPF,对WPF的喜爱自然是无以言表.但是由于我所在的地区对WPF的普及不是很广泛,所以,被迫又开始做起来web,但是我 ...
- MVC系列1-MVC基础
终于决定写一个系列的文章了,最开始其实是准备写一下WPF的,因为我这两年一直在做WPF,对WPF的喜爱自然是无以言表.但是由于我所在的地区对WPF的普及不是很广泛,所以,被迫又开始做起来web,但是我 ...
- 【ASP.NET MVC系列】浅谈ASP.NET MVC 控制器
ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...
- 【ASP.NET MVC系列】浅谈Google Chrome浏览器(操作篇)(下)
ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...
随机推荐
- Linux的phpstudy mysql登录
使用绝对路径登录 /phpStudy/mysql/bin/mysql -uroot -p; 设置远程登录密码 GRANT ALL PRIVILEGES ON *.* TO 'itoffice'@'%' ...
- C语言通过timeval结构设置周期
在C语言中,我们经常需要设置一个时间周期.在这里,我们通过Timeval结构实现时间周期的设置.首先,我们介绍timeval,其定义如下(转载http://www.cnblogs.com/wainiw ...
- 2.Nginx优化
[教程主题]:Nginx优化 [课程录制]: 创E [主要内容] Nginx 优化 nginx介绍 Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为"engine ...
- iframe自适应高度,根据src中页面来得到。
在页面布局时,div+iframe能根据具体的大小进行布局.但,对于iframe的适应大小,仍需js获取内部html文件来改变. function reinitIframe(){ var iframe ...
- 转载:[转]如何学好3D游戏引擎编程
[转]如何学好3D游戏引擎编程 Albert 本帖被 gamengines 从 游戏引擎(Game Engine) 此文为转载,但是值得一看. 此篇文章献给那些为了游戏编程不怕困难的热血青年,它的 ...
- 为Page添加INotifyPropertyChanged功能
在Page页面里面, DataContext 更新后,前台数据要求会自动更新. 但前台的绑定如果用x:bind 语法. 它要求强类型.直接关联到DataContext上就不行了. 需要为Page 添加 ...
- Codeforces #380 div2 D(729D) Sea Battle
D. Sea Battle time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- Amazon Resource Names (ARNs)
The following are the general formats for ARNs; the specific components and values used depend on th ...
- android控件
---恢复内容开始--- (1)文字大小的类型 px.dip.sp.pt.in.mm (2)TextView控件 超链接显示 属性autoLink="all" (3)EditTex ...
- WIN8 平台应用隐私声明
隐私权声明 本应用连接网络仅为控制硬件设备,不会收集你的个人信息,也不共享你个个人信息. 应用名称 雅典娜监控平台移动客户端 关于本应用 本应仅为控制设备应用,不关注任何配置相关信息,所有数据均来自服 ...