.net Filter

71 阅读1分钟

Exception Filter

手动创建异常

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace Filter.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class FilterController : ControllerBase
    {
        [HttpGet]
        public string t1()
        {
            string res = System.IO.File.ReadAllText("d:/1.tet");
            return res;

        }
    }
}

image.png

创建拦截器

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;

namespace Filter
{
    public class MyExceptionFilter : IAsyncExceptionFilter
    {
        private readonly IWebHostEnvironment webHost;

        public MyExceptionFilter(IWebHostEnvironment webHost)
        {
            this.webHost = webHost;
        }

        public Task OnExceptionAsync(ExceptionContext context)
        {

            // context.Exception 代表异常信息对象

            // context.ExceptionHandled true:其他ExceptionFilter不会执行

            string msg;
            if (webHost.IsDevelopment())
            {
                msg = context.Exception.ToString();
            }
            else
            {
                msg = "服务器发生未处理异常";
            }
            ObjectResult result = new ObjectResult(new
            {
                code = 500,
                message = msg
            });

            context.Result = result;
            context.ExceptionHandled = true;

            return Task.CompletedTask;
        }
    }
}

注册服务

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

image.png

测试

image.png

Action Filter

其他配置同理

创建拦截器

using Microsoft.AspNetCore.Mvc.Filters;

namespace Filter2
{
    public class Filter : IAsyncActionFilter
    {
        public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            Console.WriteLine("前代码");
            ActionExecutedContext actionExecutedContext = await next();
            Console.WriteLine("后代码");

        }
    }
}

image.png