.NetCore 之AOP扩展ExceptionFilter

原文:.NetCore 之AOP扩展ExceptionFilter

ExceptionFilter 主要是为了捕捉系统异常。通常我们会继承 ExceptionFilterAttribute ,实现自定义系统异常捕捉。

版本:.Net Core 3.1

    一、基本创建过程

  1. 新建 .Net Core Mvc 并新建控制器 ExceptionFilterController.NetCore 之AOP扩展ExceptionFilter
  2. Index 控制器肯定会报错,这时候我们就要实现 CustomExceptionFilterAttribute 去捕捉系统异常。

    .NetCore 之AOP扩展ExceptionFilter
     public class CustomExceptionFilterAttribute : ExceptionFilterAttribute
        {
            public override void OnException(ExceptionContext context)
            {
                context.Result = new JsonResult(new
                {
                    Result = false,
                    Message = context.Exception.Message
                });
            }
        }
    .NetCore 之AOP扩展ExceptionFilter

    F5 运行 可知 访问 Index 异常可以正常能捕捉到了。

.NetCore 之AOP扩展ExceptionFilter

   二、CustomExceptionFilterAttribute 优化

现在我们能够捕捉到了异常。接下来我们可以把 CustomExceptionFilterAttribute 在优化一下。我们知道正常网站 可能是Ajax请求或是其他页面请求。所以我们要根据请求类型返回不同的异常信息。比如 ajax 请求返回 json .其他返回 Error页面。可惜的是.NET Core 正对 Request 没有 扩展判断是否是Ajax请求。我们看一下.NET Framework 是如何实现判断Ajax请求的。

.NetCore 之AOP扩展ExceptionFilter

 

 

 所以优化后 CustomExceptionFilterAttribute  

  

 现在想在 CustomExceptionFilterAttribute 使用文件记录一些异常记录,可以把 logger 给注册进来。

  这时在 Action 有2中注册方式:

.NetCore 之AOP扩展ExceptionFilter

 

 

 ServiceFilter 和  TypeFilter 区别在于 一个需要在 全局注册实现,一个不需要。使用 ServiceFilter 在Startup中注册一下

 .NetCore 之AOP扩展ExceptionFilter

 

 

 三、探究 ServiceFilter 和 TypeFilter 原理

.NetCore 之AOP扩展ExceptionFilter

 

 .NetCore 之AOP扩展ExceptionFilter

 

 

我们看到 他们继承的都是一样的。主要是实现 CreateInstance 来获取实例对象。接下来我们模仿自定义一个

  .NetCore 之AOP扩展ExceptionFilter

 

 其实发现 ServiceFilter 和 TypeFilter 无非就是 通过  serviceProvider 获取了实例信息。只不过 TypeFilter 无需在 Startp里面注入了。做了更多的事情。

 

.NetCore 之AOP扩展ExceptionFilter

上一篇:1、CSS的3种写入方式


下一篇:起始url的调度原理