ASP.NET Core ExceptionFilter异常筛选器

什么是Filter

面向切面编程,在ASP.NET Core特定的位置执行我们自定义的代码。
ASP.NET Core 中的Filter的五种类型:Authorization filter、
Resource filter、Action filter、Exception filter、Result filter。

创建一个Controller

[Route("api/[controller]")]
    [ApiController]
    public class CustomController : ControllerBase
    {
        // GET: api/<CustomController>
        [HttpGet]
        public IEnumerable<string> Get()
        {

            throw new Exception("出错了");
            return new string[] { "value1", "value2" };
            
        }

        // GET api/<CustomController>/5
        [HttpGet("{id}")]
        public string Get(int id)
        {
            return "value";
        }

        // POST api/<CustomController>
        [HttpPost]
        public void Post([FromBody] string value)
        {
        }

        // PUT api/<CustomController>/5
        [HttpPut("{id}")]
        public void Put(int id, [FromBody] string value)
        {
        }

        // DELETE api/<CustomController>/5
        [HttpDelete("{id}")]
        public void Delete(int id)
        {
        }
    }

创建一个Exception filter

public class CustomExceptionFilter : IAsyncExceptionFilter
    {
        private readonly IWebHostEnvironment hostEnvironment;
        private readonly ILogger<CustomExceptionFilter> _logger;

        public CustomExceptionFilter(ILogger<CustomExceptionFilter> logger,IWebHostEnvironment hostEnvironment)
        {
            this.hostEnvironment = hostEnvironment;
            this._logger= logger;
        }

        public Task OnExceptionAsync(ExceptionContext context)
        {
            //context.Exception代表异常信息对象
            //context.ExceptionHandled = true;其他exceptionFilter不会再执行
            //context.Result的值会被输出给客户端
            Exception exception = context.Exception;
            _logger.LogError(exception, "UnhandledException occured");
            string message;
            if (hostEnvironment.IsDevelopment())
            {
                message = exception.ToString();
            }
            else
            {
                message = "程序中出现未处理异常";
                ObjectResult result = new ObjectResult(new { code = 500, message = message });
                result.StatusCode = 500;
                context.Result = result;
                context.ExceptionHandled = true;
            }
            return Task.CompletedTask;
        }
    }

在程序入口Program.cs中注册CustomExceptionFilter

builder.Services.Configure<MvcOptions>(opt => {
    opt.Filters.Add<CustomExceptionFilter>();
});

参考书籍 杨中科《ASP.NET Core技术内幕与项目实战》

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值