Skip to content

过虑器应用

Henry edited this page Sep 10, 2019 · 1 revision

很多时候需要在API的外层添中一些处理,如果验证、错误和逻辑缓存处理等;组件提供过虑器来完成这一功能,过虑器是基于Attribute实现可以标记在控制器或方法之上。所有逻辑过虑器必须继承FilterAttribute并产现相关方法,具体规则如下:

FilterAttribute

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]
    public class FilterAttribute : Attribute
    {
        public virtual bool Executing(ActionContext context)
        {
            return true;
        }

        public virtual void Executed(ActionContext context)
        {

        }
    }

Executing方法

控制器执行前执行,方法返回一个布尔值,如果为true则继续往下走,否则结束当前请求。

Executed方法

控制器执行后执行的过程

context参数

  • Parameters

当前请求的控制器的参数列表

  • Handler

当前控制器方法信息

  • Controller

当前方法对应的控制器对象

  • Result

获取或设置当前请求的返回值

  • Exception

获取或设置控制器处理过程的异常信息,如果存在异常的情况最终组件默认会返回500错误并带上异常信息

定义执行过程Filter

    public class GlobalFilter : FilterAttribute
    {
        public override bool Executing(ActionContext context)
        {
            Console.WriteLine($"{DateTime.Now} {context.HttpContext.Request.Url} globalFilter execting...");
            return base.Executing(context);
        }
        public override void Executed(ActionContext context)
        {
            base.Executed(context);
            Console.WriteLine($"{DateTime.Now} {context.HttpContext.Request.Url} globalFilter executed");
        }
    }

可以把Filter添加到全局过虑器中

mApiServer.ServerConfig.AddFilter<GlobalFilter>();

添加到全局时需要注意,必须在注册相关控制器前注册,否则无法添加到相关控制器上。

取消过虑器

由于过虑器可以添加到全局或控制器上,这就存在某个方法需要取消过虑器的操作,如常见的就登陆方法不需要验证。组件提供SkipFilter属性来取消方法中一个或多个过虑器,使用如下:

        [SkipFilter(typeof(GlobalFilter))]
        public string Hello(string name)
        {
            return DateTime.Now + " hello " + name;
        }