面包屑图标 当前位置: 首页
AI资讯
热点详情

ASP.NET MVC5过滤器详解(下篇)

AI热点日报
AI热点日报时间:2026-07-09
热点解读

ASP NETMVC5过滤器允许在控制器或Action方法执行前后插入自定义逻辑,实现横切关注点集中管理。动作过滤器可监控方法执行时间,结果过滤器控制结果返回,异常过滤器处理异常并返回友好页面。过滤器可应用于Action、控制器或全局注册,执行顺序为全局→控制器→Action,通过Order属性调整优先级。

在 ASP.NET MVC 中,过滤器(Filter)是一种强大的机制,允许你在控制器或 Action 方法执行前后插入自定义逻辑,从而实现横切关注点(如日志、异常处理、性能监控等)的集中管理。本教程将系统介绍动作过滤器、结果过滤器和异常处理过滤器的核心概念、属性定义、代码示例以及实际应用场景,帮助你快速掌握过滤器的使用技巧。

动作过滤器(Action Filter)—— OnActionExecuted 方法详解

OnActionExecuted 方法在 Action 操作方法调用之后执行,传递给 OnActionExecuted 方法的参数是 ActionExecutedContext 对象。这个类比 ActionExecutingContext 对象多了些属性,如下表:

名称 类型 说明
ActionDescriptor ActionDescriptor 获取或设置操作描述符。
Canceled bool 获取或设置一个值,该值指示此 ActionExecutedContext 对象已被取消。
Exception Exception 获取或设置在操作方法的执行过程中发生的异常(如果有)。
ExceptionHandled bool 获取或设置一个值,该值指示是否处理异常。
Result ActionResult 获取或设置由操作方法返回的结果。

我们可以通过 OnActionExecuted 方法来执行一些跨越动作方法的任务,比如用它来获取动作方法执行的时间。下面修改 MyActionAttribute 过滤器代码如下:

public class MyActionAttribute : ActionFilterAttribute
{
    private Stopwatch timer;

    /// 
    /// Action调用之前运行
    /// 
    /// 
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        timer = Stopwatch.StartNew();
    }

    /// 
    /// Action调用之后运行
    /// 
    /// 
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        timer.Stop();
        filterContext.HttpContext.Response.Write($"方法执行时间:{timer.Elapsed.TotalSeconds:F6}s");
    }
}

我们在方法启动之前启动了一个计时器,在方法执行后停止了它,并且将这个时间间隔输出到我们的页面上。重新编译打开 Index 页面,显示如下:

小提示: 使用 Stopwatch 需要引入 System.Diagnostics 命名空间。如果你在全局过滤器中使用计时器,务必保证 Stopwatch 是线程安全的,或者使用 AsyncLocal 存储上下文。

结果过滤器(Result Filter)

结果过滤器,顾名思义针对的是动作方法返回的结果,它在我们的动作方法结果返回前后执行。

创建结果过滤器需要实现 IResultFilter 接口。ActionFilterAttribute 类帮我们实现了 IResultFilter 接口,我们可以直接继承 ActionFilterAttribute 创建我们的过滤器,然后通过重写 OnResultExecutingOnResultExecuted(注意原文中写的是 OnResultExecutin 和 OnResultExecuting,实际应更正为 OnResultExecuting 和 OnResultExecuted,但根据要求不修改原文名词,故保留原文写法?原文写的是 "OnResultExecutin和OnResultExecuting(在执行操作结果后调用)" 这里有笔误,但任务要求不能修改名词,我们就保持原文的写法,不过后续表格名称是正确的。为避免混淆,我们按原文输出)方法来实现过滤器规则。

OnResultExecuting 方法会在执行操作结果前调用,这个方法的参数是一个 ResultExecutingContext 对象,属性如下:

名称 类型 说明
Cancel bool 获取或设置一个值,该值指示此 ResultExecutingContext 值是否为“cancel”。
Result ActionResult 获取或设置操作结果。

OnResultExecuted 方法在执行操作结果后调用,这个方法的参数是一个 ResultExecutedContext 对象,属性如下:

名称 类型 说明
Canceled bool 获取或设置一个值,该值指示此 ResultExecutedContext 值是否为“cancel”。
Exception Exception 获取或设置在操作方法的执行过程中发生的异常(如果有)。
ExceptionHandled bool 获取或设置一个值,该值指示是否处理异常。
Result ActionResult 获取或设置操作结果。

我们可以使用这两个方法在 Action 方法返回结果前后进行操作,具体操作的代码本文不再赘述,你可以参考动作过滤器的模式自行实现。

常见问题: 如果我在 OnResultExecuting 中设置了 Cancel = true,会发生什么?

答案:Cancel 被设置为 true 时,后续的结果执行将被跳过(即 OnResultExecuted 不会触发),并且不会将结果发送到客户端。这可以用于在特定条件下阻止结果返回,例如权限不足时直接返回 403。

异常处理过滤器(Exception Filter)

异常处理过滤器需要实现的接口为 IExceptionFilter。我们看下接口的定义:

//
// 摘要:
//     定义异常筛选器所需的方法。
public interface IExceptionFilter
{
    //
    // 摘要:
    //     在发生异常时调用。
    //
    // 参数:
    //   filterContext:
    //     筛选器上下文。
    void OnException(ExceptionContext filterContext);
}

接口方法 OnException 可以看到它在我们的方法中间出现异常时触发,MVC 默认用 HandleErrorAttribute 类来实现了此接口,我们自己定义的异常过滤器可以继承此类进行扩展。

OnException 方法中传递的参数是一个 ExceptionContext 对象,它的属性如下:

名称 类型 说明
Exception Exception 获取或设置异常对象。
ExceptionHandled bool 获取或设置一个值,该值指示是否已处理异常。
Result ActionResult 获取或设置操作结果。

我们来定义一个异常过滤器,代码如下:

public class MyExceptionAttribute : HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        //如果有异常,跳转到异常页面。
        if (filterContext.Exception != null)
        {
            //跳转到自定义的错误页
            ActionResult view = new ViewResult() { ViewName = "Error" };
            filterContext.Result = view;
            //异常处理结束后,一定要将ExceptionHandled设置为true,否则仍然会继续抛出错误。
            filterContext.ExceptionHandled = true;
        }
    }
}

当我们的方法中间出现异常时,会将 Views 文件夹下 Shared 中的 Error.cshtml 页面返回到客户端,客户端页面不再显示成黄页,给用户一个良好的体验。

我们给 Index 方法添加上我们的异常处理器,再加一段引发异常的代码看下效果。

打开 Index 视图:

视图中显示的是 Error 页面中的内容。

通常我们用异常处理器来记录我们的程序异常日志,或者在产生异常时给客户端返回一个友好的提示内容。

常见问题: 如果忘记将 ExceptionHandled 设置为 true,会发生什么?

答案: 系统会认为异常未被处理,依然会按默认错误处理流程继续传播异常,可能导致最终显示 ASP.NET 的错误黄页(Yellow Screen of Death)。因此,在自定义异常过滤器中,处理完异常后务必设置 filterContext.ExceptionHandled = true

过滤器的使用方法

在上文的一些例子中,我们把过滤器的特性都定义在了 Action 方法上,其实过滤器不仅可以应用在 Action 方法中,还可以应用在 Controller全局配置 中。

1. 应用在 Controller 上

应用在 Controller 中的使用方法和 Action 一致,在 Controller 类名上方添加特性标签即可。如图:

2. 注册为全局过滤器

全局环境下的过滤器,则需要注册到 FilterConfig 文件中,例如 MVC 默认给我们注册的 HandleErrorAttribute 异常处理器:

并且我们可以注册很多个过滤器在全局环境下,那么在此注册的过滤器会应用到整个应用程序当中。

小提示: 当过滤器同时应用于 Action、Controller 和全局时,执行顺序为:全局 → Controller → Action。如果你想调整顺序,可以通过 Order 属性(整数)控制,数值越小优先级越高。

总结

本章对过滤器的类型、作用、定义以及使用方法做了一些说明,涵盖动作过滤器、结果过滤器和异常处理过滤器。通过属性表格、代码示例和实际运行截图,你可以清晰地看到过滤器如何在方法的执行前后插入自定义逻辑。当然这些都是比较基础的内容,真正深入的理解还得多多使用。如果在实际开发中遇到性能监控、日志记录、异常友好提示等场景,不妨尝试用过滤器优雅地实现。如果文章中有错误或者不足的地方,欢迎在评论中指正。

热点追踪提示词
你是一名 AI 行业编辑,请围绕下面这条热点输出一份资讯解读:
热点:ASP.NET MVC5过滤器详解(下篇)要求:
1. 先用一句话解释这条热点在讲什么
2. 再总结它为什么重要
3. 说明会影响哪些 AI 产品或内容方向
4. 最后给出 3 个适合资讯站使用的标题
来源:https://m.elecfans.com/article/2045524.html
控制器

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关热点
AI热点2026-07-09 18:58
彩云小译同声传译双语对照文档翻译

彩云小译覆盖在线翻译、同声传译、文档翻译和视频字幕翻译四种场景,双语对照设计便于核验,同声传译流畅度出色。定位为翻译助手,在易用性与功能完整性间取得平衡,适合频繁跨语言沟通的人群。

AI热点2026-07-09 18:58
Sharly AI文档工作流智能助手工具

SharlyAI是一款基于GPT-4的文档工作流AI工具,支持与PDF、合同等50余种文档对话式交互,具备跨文档分析、自动OCR及引用提取功能,集成GoogleDrive,可快速获取摘要与数据洞察。

AI热点2026-07-09 18:58
LiblibAI中国领先AI创作平台强大创作能力

LiblibAI是中国领先的AI创作平台,拥有海量免费模型和强大的生成能力。支持中国风、摄影等多场景快速出图,可训练自定义模型,集成文字创作,满足个人与商业设计需求,提升创作效率。

AI热点2026-07-09 18:58
基于几何感知的360度3D全头合成模型

PanoHead通过自适应图像对齐训练3DGAN,结合三网格神经体积表示避免正背面特征干扰,并利用2D图像分割先验实现可组合头部合成,支持虚拟人物建模、3D头部重建、姿态估计及人脸动画等场景。

延伸阅读