-
-
Notifications
You must be signed in to change notification settings - Fork 175
过虑器应用
Henry edited this page Sep 10, 2019
·
1 revision
很多时候需要在API
的外层添中一些处理,如果验证、错误和逻辑缓存处理等;组件提供过虑器来完成这一功能,过虑器是基于Attribute
实现可以标记在控制器或方法之上。所有逻辑过虑器必须继承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)
{
}
}
控制器执行前执行,方法返回一个布尔值,如果为true则继续往下走,否则结束当前请求。
控制器执行后执行的过程
- Parameters
当前请求的控制器的参数列表
- Handler
当前控制器方法信息
- Controller
当前方法对应的控制器对象
- Result
获取或设置当前请求的返回值
- Exception
获取或设置控制器处理过程的异常信息,如果存在异常的情况最终组件默认会返回500错误并带上异常信息
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;
}