Fork me on GitHub
随笔 - 184,  文章 - 0,  评论 - 117,  阅读 - 62万

在WEB Api中,引入了面向切面编程(AOP)的思想,在某些特定的位置可以插入特定的Filter进行过程拦截处理。引入了这一机制可以更好地践行DRY(Don’t Repeat Yourself)思想,通过Filter能统一地对一些通用逻辑进行处理,如:权限校验、参数加解密、参数校验等方面我们都可以利用这一特性进行统一处理,今天我们来介绍Filter的开发、使用以及讨论他们的执行顺序。

1.Web中常用的Filter

Web api中最常用的filter有AuthorizeAttribute,ActionFilterAttribute,ExceptionFilterAttribute。AuthorizeAttribute主要用于权限的认证,ActionFilterAttribute用于action的处理,ExceptionFilterAttribute用于异常的处理

2.代码

/// <summary>
/// 监测数据类
/// </summary>
public class GlobalClass
{
    public static string Message = "";
}
复制代码
/// <summary>
/// action过滤器
/// </summary>
public class TestActionFilterAttribute: ActionFilterAttribute
{
    /// <summary>
    /// 执行后
    /// </summary>
    /// <param name="actionExecutedContext"></param>
    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        GlobalClass.Message = GlobalClass.Message + " OnActionExecuted;";
    }

    /// <summary>
    /// 执行前
    /// </summary>
    /// <param name="actionContext"></param>
    public override void OnActionExecuting(HttpActionContext actionContext) {
        GlobalClass.Message = GlobalClass.Message + " OnActionExecuting;";
    }
}
复制代码
复制代码
/// <summary>
/// 授权过滤器
/// </summary>
public class TestAuthorizeAttribute: AuthorizeAttribute
{
    /// <summary>
    /// 授权方法
    /// </summary>
    /// <param name="actionContext"></param>
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        GlobalClass.Message = GlobalClass.Message + " OnAuthorization;";
    }
}
复制代码
复制代码
/// <summary>
/// 异常处理
/// </summary>
public class TestExceptionFilterAttribute : ExceptionFilterAttribute
{
    /// <summary>
    /// 异常处理
    /// </summary>
    /// <param name="actionExecutedContext"></param>
    public override void OnException(HttpActionExecutedContext actionExecutedContext) {
        GlobalClass.Message = GlobalClass.Message + " OnException;";
        actionExecutedContext.Response = new HttpResponseMessage()
        {
            StatusCode = HttpStatusCode.OK,
            Content = new StringContent(GlobalClass.Message, Encoding.UTF8, "application/json"),
        };
    }
}
复制代码
复制代码
public class ValuesController : ApiController
{
    public ValuesController() {
        GlobalClass.Message = "";
        GlobalClass.Message = GlobalClass.Message + " ValuesController;";
    }

    [TestActionFilter]
    [TestExceptionFilter]
    [TestAuthorize]
    public string Get(int id)
    {
        GlobalClass.Message = GlobalClass.Message + " Get;";
        int.Parse("asdf");//测试异常
        return GlobalClass.Message;
    }
}
复制代码

3.执行结果

4.总结

由此可以看出Web api的执行顺序,构造函数 》AuthorizeAttribute 》ActionFilterAttribute 》ExceptionFilterAttribute

AuthorizationFilter的执行是ActionInvoker进行Action执行的第一项工作,因为后续的工作(Model绑定、Model验证、Action方法执行等)只有在成功授权的基础上才会有意义。

posted on   lingfeng95  阅读(446)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示