过滤器的作用域是什么,为什么会有奇怪的名字

本文关键字:为什么 作用域 是什么 过滤器 | 更新日期: 2023-09-27 18:08:12

. NET Filters过滤器按以下顺序运行:

    <
  1. 授权过滤器/gh><
  2. 操作过滤器/gh><
  3. 响应过滤器/gh><
  4. 异常过滤器/gh>

在每个过滤器类型中都有一个过滤器Order,它指定了运行顺序。

到目前为止是有意义的…但接下来就很奇怪了。

在每个过滤器类型和中排序的另一种方法表示为以下值的枚举:

public enum FilterScope
{
    First = 0,
    Global = 10,
    Controller = 20,
    Action = 30,
    Last = 100,
}

全局、控制器和动作在操作过滤器的运行顺序中有什么关系?

例如:

如果我有两个动作过滤器,它们的运行顺序分别为控制器和动作的1和FilterScope

除了一个在另一个前面排序,ControllerAction对任何东西有什么影响?

进一步Bizarreness

由此可见,FilterScope为滤波器提供了三级排序。Controller, Global,或Action是一个过滤器的顺序,在没有任何方式限制只使用Controller, Action,不一定适用于全局?它不是对顺序的描述。

另外,如果它确实提供了第三级过滤,为什么它仅限于5个选项?

过滤器的作用域是什么,为什么会有奇怪的名字

Filter对象,即实际具有Scope属性的对象,是根据使用情况构建的——当您向全局应用程序过滤器添加过滤器时,Filter对象将使用GlobalScope来构建。类似地,当从控制器和动作收集过滤器属性时,分别使用ControllerAction的作用域构造Filter对象。

我不完全确定FilterFirstLastScope实际上是如何创建的。

指定这些规则是为了说明如果您在全局级别和操作级别声明了一个过滤器,并且使用相同的Order值,那么如何应用断线规则—这比在同一级别声明的过滤器更值得关注,因为您希望手动确保每个过滤器使用唯一的Order(如果您关心排序)。

嗯,我真的不明白你到底觉得这里有什么奇怪的。

授权、动作、响应和例外过滤器是4个接口,您可以实现运行过滤器逻辑,IAuthorizationFilterIActionFilterIResultFilterIExceptionFilter接口。

之后,业务规则就出来了。例如,您必须检查某些用户操作的访问权限。您不仅实现了授权过滤器,还创建了检查规则的逻辑,如

    如果用户没有完成注册,你必须提醒他这一点。无论用户在您的站点上做什么,该规则都应该在First上运行。
  • 如果用户没有被批准,他不能查看网站内容,应该得到一个验证消息。所以这是一个Global范围的规则,它应该在任何其他检查用户权限之前运行。
  • 如果用户没有某些部门的访问权限,他就不能在网站上查看有关该部门的某些内容,但不是全部——所以我们让Controller选择应该显示给用户的内容。
  • 如果用户不是管理员,他不能编辑或删除某些内容。所以,这是一个正在被过滤的具体的Action
  • 我们可以在任务被处理后启动一些记录器,所以我们必须等到工作完成,并在Last运行filter。

我在这里看到了一个非常简单的过滤器排序模型,我可以为每一对或filter type/filter scope提供一个示例。

更新:

过滤器排序的一些示例代码:

public class ControllerInstanceFilterProvider : IFilterProvider {
    public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor) {
        if (controllerContext.Controller != null) {
            // Use FilterScope.First and Order of Int32.MinValue to ensure controller instance methods always run first
            yield return new Filter(controllerContext.Controller, FilterScope.First, Int32.MinValue);
        }
    }
}

根据我的理解,

filter order表示过滤器运行的顺序。所以过滤器按以下顺序运行:

    <
  1. 授权过滤器/gh><
  2. 操作过滤器/gh>
  3. 响应滤波器
  4. 异常过滤器

在每个过滤器类型中,Order值指定运行顺序。在每个过滤器类型和顺序中,SCOPE枚举值指定过滤器的顺序。

例如

:onactionexecution()过滤器将Order属性设置为零并将过滤范围设置为首先运行在将Order属性设置为零且将过滤范围设置为的动作过滤器之前。

Order和scope用于每个过滤器类型之间的内部优先级。