asp.net core MVC 过滤器之ActionFilter过滤器(2)

平面设计 2025-04-06 02:17www.168986.cn平面设计培训

ASP.NET Core MVC中的ActionFilter过滤器系列

亲爱的开发者们,你们好!今天我们要一同ASP.NET Core MVC的过滤器世界,特别是ActionFilter过滤器的奥秘。你是否曾为重复编写验证Model的代码而感到烦恼?今天,我们将向你展示如何通过ActionFilter过滤器简化这些重复操作。

系列大纲如下:

一、ASP.NET Core MVC 过滤器概览

二、ActionFilter过滤器详解

三、ResultFilter过滤器的魔力

四、ResourceFilter过滤器的应用场景

五、AuthorizationFilter过滤器的授权机制

简介:

在ASP.NET Core MVC中,Action过滤器在Controller的Action执行前后扮演着重要角色。它们允许我们在Action执行之前和之后执行特定的操作。

如何实现自定义的Action过滤器呢?让我们一同来。

实现自定义的Action过滤器需要继承IActionFilter接口,并实现两个核心方法:OnActionExecuted和OnActionExecuting。在Action执行之前,OnActionExecuting方法将被调用;而在Action执行之后,OnActionExecuted方法将被触发。

现在让我们来看看如何利用这一特性简化我们的代码。在MVC开发中,Model验证是非常重要的一环。我们通常在Action中定义Model的约束,并验证Model是否成功绑定。但这样的操作涉及到大量的重复代码。以下是一个典型的例子:

[HttpGet]

public ActionResult Get()

{

if (!ModelState.IsValid) return BadRequest("参数错误!");

// 其他逻辑处理...

}

public void OnActionExecuting(ActionExecutingContext context)

{

if (context.ModelState.IsValid) return; // 如果Model验证通过,直接返回

// 获取第一个有错误的ModelState信息

var modelState = context.ModelState.FirstOrDefault(f => f.Value.Errors.Any());

// 获取错误信息并抛出异常

string errorMsg = modelState.Value.Errors.First().ErrorMessage;

throw new AppException(errorMsg); // 抛出异常信息到异常过滤器ExceptionFilter中处理

}

通过这样的实现,当Model绑定出现错误时,我们可以立即抛出异常信息,并在异常过滤器ExceptionFilter中捕获这些错误信息,然后将它们返回给请求方。这样,我们不仅能够简化代码,还能提高代码的整洁性和可读性。希望这个系列能让你对ASP.NET Core MVC的过滤器有更深入的了解和掌握!我们可以使用ActionFilter的特性来监控Action的执行时间,并在执行时间过长时生成警告日志。

在ASP.NET Core项目中,你可以创建一个自定义的ActionFilter类,它实现了IActionFilter接口。这个类中包含两个方法:OnActionExecuting和OnActionExecuted。在OnActionExecuting方法中,我们创建一个Swatch对象并启动计时器。然后将这个Swatch对象添加到HttpContext的Items集合中,以便在Action执行完毕后获取执行时间。在OnActionExecuted方法中,我们从HttpContext的Items集合中获取Swatch对象并停止计时器,获取执行时间。如果执行时间超过5秒,则创建一个ILogger对象并输出警告日志。

下面是自定义ActionFilter类的实现代码:

```csharp

public class ActionFilter : IActionFilter

{

public void OnActionExecuted(ActionExecutedContext context)

{

var httpContext = context.HttpContext;

var swach = httpContext.Items[Resources.SwachKey] as Swatch;

swach.Stop(); // 停止计时器获取执行时间

var time = swach.Elapsed; // 获取执行时间

if (time.TotalSeconds > 5) // 如果执行时间超过5秒

{

var factory = context.HttpContext.RequestServices.GetService(); // 获取ILoggerFactory服务

var logger = factory.CreateLogger(); // 创建ILogger对象并指定日志类别为ActionExecutedContext

logger.LogWarning($"{context.ActionDescriptor.DisplayName}执行耗时:{time.ToString()}"); // 输出警告日志

}

}

public void OnActionExecuting(ActionExecutingContext context)

{

var swach = new Swatch(); // 创建Swatch对象并启动计时器

swach.Start();

context.HttpContext.Items.Add(Resources.SwachKey, swach); // 将Swatch对象添加到HttpContext的Items集合中以便后续获取执行时间

}

}

```

接下来,我们需要将这个过滤器注册为全局过滤器。找到系统根目录下的Startup.cs文件,修改ConfigureServices方法如下:

```csharp

services.AddMvc(options =>

{

options.Filters.Add(); // 添加自定义的ActionFilter过滤器到Mvc选项的过滤器集合中

});

``` 这样就完成了全局过滤器的注册。每当有Action执行时,都会自动运行我们定义的过滤器代码,监控Action的执行时间并在超过设定阈值时输出警告日志。这对于性能优化和故障排查非常有帮助。以上内容希望对大家的编程学习有所帮助,也请大家多多支持我们的博客。记得持续关注狼蚁SEO,获取更多实用技术分享。

上一篇:吸血鬼骑士开头曲 下一篇:没有了

Copyright © 2016-2025 www.168986.cn 狼蚁网络 版权所有 Power by