📜  ASP.NET MVC-过滤器(1)

📅  最后修改于: 2023-12-03 14:59:24.361000             🧑  作者: Mango

ASP.NET MVC-过滤器

简介

在ASP.NET MVC中,过滤器是一种机制,它允许开发人员在请求到达控制器或者控制器返回响应之前或之后执行某些操作。过滤器可以对请求和响应进行额外的处理、日志记录、请求验证和授权等操作。

ASP.NET MVC提供了多种不同类型的过滤器,包括控制器过滤器、操作过滤器、授权过滤器、结果过滤器和异常过滤器。

过滤器的执行顺序

在ASP.NET MVC中,不同类型的过滤器是按照特定的顺序来执行的。这个执行顺序是从外到内、从上到下的,这意味着在内部的过滤器会先于外部的过滤器执行,同级别的过滤器则按照它们在代码中的先后顺序执行。

以下是过滤器执行顺序的详细列表:

  1. 授权过滤器: 在Action执行之前进行身份验证和授权操作。如果未通过身份验证或授权检查,则Action将不会执行。
  2. 控制器过滤器: 用于处理特定的控制器,它们会在Action执行前后执行。
  3. 操作过滤器: 处理Action之前和之后要执行的操作。Action方法执行前,会先执行ActionFilterAttribute的OnActionExecuting方法。在Action方法执行后,会执行ActionFilterAttribute的OnActionExecuted方法。
  4. 结果过滤器: 处理Action中返回的ActionResult及其派生类。ActionResult是控制器处理完成后返回的结果,可以是View或JsonResult。自定义的ActionResult必须派生自ActionResult类。
  5. 异常过滤器: 当Action执行引发异常时,会执行异常过滤器。
使用过滤器

要使用过滤器,可以在控制器、Action方法或者全局中注册过滤器。过滤器可以通过特性来添加到Action方法或者控制器中。例如下面是一个添加授权过滤器的例子:

[Authorize]
public class HomeController : Controller
{
    // ...
}

可以在Action方法中添加操作过滤器:

public class HomeController : Controller
{
    [HttpGet]
    [LogAction]
    public IActionResult Index()
    {
        // ...
    }
}

或者在全局中注册过滤器:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc(options =>
    {
        options.Filters.Add<ExceptionFilter>();
        options.Filters.Add<LogFilter>();
    });
}
自定义过滤器

ASP.NET MVC允许开发人员自定义过滤器。使用过滤器可以将代码包装在特定的过滤器方法中,使其处理请求和响应中的额外逻辑。

要自定义一个过滤器,需要继承ActionFilterAttribute基类,并覆盖需要实现的方法。例如下面是一个自定义操作过滤器的例子:

public class LogActionAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        // 在Action执行之前记录日志
        base.OnActionExecuting(context);
    }
 
    public override void OnActionExecuted(ActionExecutedContext context)
    {
        // 在Action执行之后记录日志
        base.OnActionExecuted(context);
    }
}

自定义的过滤器可以通过特性来添加到控制器、Action方法或者全局中。

总结

过滤器是ASP.NET MVC中的一个重要概念,可以在请求到达控制器或控制器返回响应之前或之后执行某些操作。ASP.NET MVC提供了多种类型的过滤器,包括控制器过滤器、操作过滤器、授权过滤器、结果过滤器和异常过滤器。开发人员可以使用现有过滤器或自定义过滤器来处理请求和响应。