自定义Filter的基本思路是继承基类ActionFilterAttribute,并根据实际需要重写OnActionExecuting,OnActionExecuted,OnResultExecuting,OnResultExecuted这四个中的一个或多个方法。

  注意类名一定要以Attribute结尾。

  故名思义,Action执行前,执行后,结果返回前,结果返回后。所以它们的执行先后顺序就是OnActionExecuting,OnActionExecuted,Action,OnResultExecuting,OnResultExecuted。

  以下是我个人在工作中的两处实际用法分享。

 一、重写OnActionExecuting,限制请求来源。

  利用最近在做微信企业号应用开发。过程中需对所有请求来源限制为只能是微信客户端。应用是基于asp.net mvc做的,所以第一反应就是借助filter过滤器实现。

  在App_Start文件夹下新建类OutOfWeiXinAttribute,并继承ActionFilterAttribute,然后重写OnActionExecuting方法。通过 Request.UserAgent中是否包含micromessenger字符标识判断请求是否来自微信客户端,最后通过filterContext.Result设置自定义返回结果。

 /// <summary>
/// 防止应用程序在微信以外的地方打开
/// </summary>
public class OutOfWeiXinAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
string userAgent = filterContext.RequestContext.HttpContext.Request.UserAgent.ToLower(); LogHelper<OutOfWeiXinAttribute>.Debug("userAgent:" + userAgent);
var isWeixin = userAgent.IndexOf("micromessenger") != -; //以下代码只会在调试时执行
#if DEBUG
isWeixin = true;
#endif
// if (!isWeixin)
{
ViewResult view = new ViewResult();
view.ViewName = "OutofWeixinApp";
filterContext.Result = view;
}
else
{
base.OnActionExecuting(filterContext);
} }
}

自定义Filter

  在需要做此限制的Controller或者Action上直接写上[OutOfWeiXin]就实现了想要的功能。

  #if DEBUG

  coding..

  #endif

  其中的coding 部分只有在调试环境下才会执行,所以可以用来方便调试使用。

  二、重写OnActionExecuted,统一处理抛出的异常。

  重写OnActionExecuted,判断filterContext.Exception是否为空,即可找到异常。设置filterContext.ExceptionHandled = true;

  返回结果filterContext.Result = view;就完成了统一处理异常。

  

 /// <summary>
/// 捕获全局异常
/// </summary>
public class LoggingFilterAttribute :ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (filterContext.Exception != null)
{
//发送邮件并记录异常日志
LogHelper<LoggingFilterAttribute>.SendEmaiAndLogError(filterContext.Exception); filterContext.Canceled = true;
filterContext.ExceptionHandled = true;
ViewResult view = new ViewResult();
view.ViewName = "Error";
filterContext.Result = view;
} base.OnActionExecuted(filterContext);
}
}

自定义Filter处理全局异常

  在需要应用的Controller或Action上写上[HandleError,LoggingFilter]就可以了。

Asp.net mvc自定义Filter简单使用的更多相关文章

  1. [asp.net mvc]自定义filter

    写在前面 最近在摸索mvc,在app中的webview中嵌入h5应用,经常需要用到对cookie的读取操作.所以想到通过自定义的filter截取cookie,然后通过在action上面打特性的方式针对 ...

  2. 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) C#中缓存的使用 C#操作redis WPF 控件库——可拖动选项卡的TabControl 【Bootstrap系列】详解Bootstrap-table AutoFac event 和delegate的分别 常见的异步方式async 和 await C# Task用法 c#源码的执行过程

    反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑)   背景介绍: 为了平衡社区成员的贡献和索取,一起帮引入了帮帮币.当用户积分(帮帮点)达到一定数额之后,就会“掉落”一定数量的“帮帮 ...

  3. asp.net mvc 自定义pager封装与优化

    asp.net mvc 自定义pager封装与优化 Intro 之前做了一个通用的分页组件,但是有些不足,从翻页事件和分页样式都融合在后台代码中,到翻页事件可以自定义,再到翻页和样式都和代码分离, 自 ...

  4. ASP.NET MVC 自定义路由中几个需要注意的小细节

    本文主要记录在ASP.NET MVC自定义路由时,一个需要注意的参数设置小细节. 举例来说,就是在访问 http://localhost/Home/About/arg1/arg2/arg3 这样的自定 ...

  5. Asp.net Mvc 自定义Session (二)

    在 Asp.net Mvc 自定义Session (一)中我们把数据缓存工具类写好了,今天在我们在这篇把 剩下的自定义Session写完 首先还请大家跟着我的思路一步步的来实现,既然我们要自定义Ses ...

  6. Asp.net mvc 自定义全局的错误事件HandleErrorAttribute无效

    Asp.net mvc 自定义全局的错误事件HandleErrorAttribute,结果无效, 原因: 1.没有在RegisterGlobalFilters 里面添加或者你要的位置添加. 2.你把这 ...

  7. ASP.NET MVC自定义验证Authorize Attribute(包含cookie helper)

    前几天Insus.NET有在数据库实现过对某一字段进行加密码与解密<使用EncryptByPassPhrase和DecryptByPassPhrase对MS SQLServer某一字段时行加密和 ...

  8. ASP.NET MVC 自定义Razor视图WorkContext

    概述 1.在ASP.NET MVC项目开发的过程中,我们经常需要在cshtml的视图层输出一些公用信息 比如:页面Title.服务器日期时间.页面关键字.关键字描述.系统版本号.资源版本号等 2.普通 ...

  9. asp.net MVC 自定义模型绑定 从客户端中检测到有潜在危险的 Request.QueryString 值

    asp.net mvc 自定义模型绑定 有潜在的Requset.Form 自定义了一个模型绑定器.前端会传过来一些敏感字符.调用bindContext. valueProvider.GetValue( ...

随机推荐

  1. java中构造方法的特殊性

    构造方法名与类名相同 构造方法没有返回值,也不能写void 构造方法的主要作用是完成对对象的初始化工作 构造方法一般不由编程人员显示调用,而是由new来调用 在创建一个类的对象的同时,系统会自动调用该 ...

  2. EF6 Power Tools的妙用和问题

    环境:vs2013+EF:6.1.3.0+Power Tools:Beta 4 power tools:是一个反向工程,在已有数据库的情况下,可以利用它生成Code Frist模式的代码. 问题: 它 ...

  3. 考勤系统代码分析——主页布局easyui框架

    考勤系统主页的布局用的是easyui的Layout控件 Layout:布局容器有5个区域:北.南.东.西和中间.中间区域面板是必须的,边缘的面板都是可选的.每个边缘区域面板都可以通过拖拽其边框改变大小 ...

  4. python 邮件基础篇

    python 操作邮件,不是很方便,说实话还不是理解的特别透彻,这次想把自己碰到的东西总结下来 邮件有imap,pop,imap协议,这次使用的是imap4协议,主要用了imap4和mail类, 代码 ...

  5. HTML5的实用

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "PingFang SC"; color: #ffffff } p.p2 ...

  6. OpenCascade B-Spline Basis Function

    OpenCascade B-Spline Basis Function eryar@163.com Abstract. B-splines are quite a bit more flexible ...

  7. 深入理解DOM节点类型第七篇——文档节点DOCUMENT

    × 目录 [1]特征 [2]快捷访问 [3]文档写入 前面的话 文档节点document,隶属于表示浏览器的window对象,它表示网页页面,又被称为根节点.本文将详细介绍文档节点document的内 ...

  8. Android 内存管理 &Memory Leak & OOM 分析

    转载博客:http://blog.csdn.net/vshuang/article/details/39647167 1.Android 进程管理&内存 Android主要应用在嵌入式设备当中 ...

  9. c++堆

    c++ reference: http://www.cplusplus.com/reference/algorithm/make_heap/ heap并不属于STL容器组件,它分为 max heap ...

  10. 如何 判断 设备 是否 连接 上 了 wifi

    这里,我给出一个函数 public boolean sale_connect_check(WifiConfiguration wcg,Context context) { boolean judge_ ...