自定义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]就可以了。