【asp.net core 系列】10 實戰之ActionFilter
阿新 • • 發佈:2020-06-18
# 0.前言
在上一篇中,我們提到了如何建立一個UnitOfWork並通過ActionFilter設定啟用。這一篇我們將簡單介紹一下ActionFilter以及如何利用ActionFilter,順便補齊一下上一篇的工具類。
# 1. ActionFilter 介紹
ActionFilter全稱是ActionFilterAttribute,我們根據微軟的命名規範可以看出這是一個特性類,看一下它的宣告:
```c#
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public abstract class ActionFilterAttribute : Attribute, IActionFilter, IFilterMetadata, IAsyncActionFilter, IAsyncResultFilter, IOrderedFilter, IResultFilter
```
這是一個允許標註在類和方法上的特性類,允許多個標記,標註之後子類會繼承父類的特性。然後,這個類是一個抽象類,所以我們可以通過繼承ActionFilterAttribute來編寫自己的ActionFilter。
## 1.1 ActionFilter的四個方法
對於一個ActionFilter而言,最重要的是它的四個方法:
```c#
public virtual void OnActionExecuted(ActionExecutedContext context);
public virtual void OnActionExecuting(ActionExecutingContext context);
public virtual void OnResultExecuted(ResultExecutedContext context);
public virtual void OnResultExecuting(ResultExecutingContext context);
```
![image-20200615231334442](https://img2020.cnblogs.com/other/1266612/202006/1266612-20200618054026637-2001331197.png)
上圖是這四個方法在一次請求中執行的順序。在一次請求真正執行之前,想要攔截這個請求,應該使用`OnActionExecuting`。
為什麼單獨說這個呢?因為這個方法的出鏡率很高,大多數時候都會使用這個方法進行請求過濾。
## 1.2 在ActionFilter中我們能做什麼
我們來簡單介紹一下,四個方法中的四種上下文型別,看一看裡面有哪些我們可以利用的方法:
### 1.2.1 ActionExecutingContext
這是一個Action執行前的上下文,表示Action並未開始執行,但是已經獲取到了控制器例項:
```c#
public class ActionExecutingContext : FilterContext
{
public virtual IDictionary