Action Filter
为了让用户更简单的创建一个自定义Action filter,ASP.NET MVC Framework提供了一个基类ActionFilterAttribute,这个类实现了IActionFilter和IResultFilter接口,并且继承了FilterAttribute类。从广义上来说,在ASP.NET MVC Framework中,任何实现filter的类型都是action filter。
ActionFilter成员:
- OnActionExecuting – 在controller action执行之前调用
- OnActionExecuted – 在controller action执行之后调用
- OnResultExecuting – 在controller action result执行之前调用
- OnResultExecuted – 在controller action result执行之后调用
执行顺序如下图:
下面是个小例子:
新建一个类MyActionFilter继承ActionFilterAttribute
public class MyActionFilter : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { //记录时间 filterContext.HttpContext.Items["StartTime"] = DateTime.Now; //验证是否登录 var service = (IFormsAuthorizeService)filterContext.Controller; //子控件不做权限验证 if (filterContext.IsChildAction) return; //源请求页面url地址 string url = filterContext.HttpContext.Request.RawUrl; if (!service.SignIn()) { if (filterContext.HttpContext.Request.IsAjaxRequest()) { JsonResult jr = new JsonResult(); jr.Data = new { url = "/passport/login" }; jr.JsonRequestBehavior = JsonRequestBehavior.AllowGet; filterContext.Result = jr; } else filterContext.Result = new RedirectResult("/passport/login?redirectUrl=" + url); } } public override void OnActionExecuted(ActionExecutedContext filterContext) { //处理异常 if (filterContext.Exception != null) { filterContext.ExceptionHandled = true; filterContext.Result = new RedirectToRouteResult("Default" , new System.Web.Routing.RouteValueDictionary(new { action = "OnError" })); } } public override void OnResultExecuting(ResultExecutingContext filterContext) { //压缩输出结果 string acceptEncoding = filterContext.HttpContext.Request.Headers["Accept-Encoding"]; if (string.IsNullOrEmpty(acceptEncoding)) return; var response = filterContext.HttpContext.Response; acceptEncoding = acceptEncoding.ToUpperInvariant(); if (acceptEncoding.Contains("GZIP")) { response.AppendHeader("Content-encoding", "gzip"); response.Filter = new GZipStream(response.Filter, CompressionMode.Compress); } else if (acceptEncoding.Contains("DEFLATE")) { response.AppendHeader("Content-encoding", "deflate"); response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress); } } public override void OnResultExecuted(ResultExecutedContext filterContext) { //计算出页面相应时间 DateTime statTime = (DateTime)filterContext.HttpContext.Items["StartTime"]; TimeSpan diff = DateTime.Now - statTime; filterContext.HttpContext.Response.Write("<hr />" + diff.ToString()); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构