Asp.net Core Filter过滤器异常错误处理

本文旨在:

1 继承ExceptionFilterAttribute,重写Override OnException(ExceptionContext context)处理异常

2 使用.netCore的依赖注入,在属性中注入日志框架,记录异常日志

以下详细回答以上两个问题:

1 继承ExceptionFilterAttribute,重写Override OnException(ExceptionContext context)处理异常

新建class文件,命名ExceptionHandler,继承特性ExceptionFilterAttribute,重写 OnException,处理异常 重新赋值请求页面返回的Result,返回json,string content,Error Page三种形式

public class ExceptionHandle : ExceptionFilterAttribute
{
 	public override void OnException(ExceptionContext context)
    {
        var ex = context.Exception;
        var controllername = context.RouteData.Values["controller"].ToString();
        var actionname = context.RouteData.Values["action"].ToString();
        
        if (context.ExceptionHandled == false)
        {
        context.Result= ReturnResult(resultType.ContentResult,ex);
        }
        context.ExceptionHandled = true; //异常已处理了
    }
}

  处理异常返回的Result:共三种形式 Page,Json,html content

        private IActionResult ReturnResult(resultType rtype, Exception ex)
        {
            IActionResult result;
            switch (rtype)
            {
                case resultType.ContentResult:
                    result = new ContentResult
                    {
                        Content = ex.Message,
                        StatusCode = StatusCodes.Status500InternalServerError,
                        ContentType = "text/html;charset=utf-8"
                    };
                    break;
                case resultType.JsonResult:
                    result = new JsonResult(new { msg = ex.Message });
                    break;
                case resultType.Redirect:
                    result = new RedirectToRouteResult(
                        new RouteValueDictionary{
                            { "controller","Home"},
                            {"action","Error" },
                            {"msg",ex.Message }
                        }
                    );
                    break;
                default:
                    result = new RedirectResult("../home/error");
                    break;
            }
            return result;
        }
        enum resultType
        {
            ContentResult = 1,
            JsonResult = 2,
            Redirect = 3
        }

  

2 使用.netCore的依赖注入,在属性中注入日志框架,记录异常日志

startup.cs 依赖注入容器:

    public void ConfigureServices(IServiceCollection services)
    {
    ...
    services.AddScoped<ExceptionHandle>();
    }

  构造函数注入参数 logger

public class ExceptionHandle : ExceptionFilterAttribute
    {
        private readonly ILogger<ExceptionHandle> _logger;
        public ExceptionHandle(ILogger<ExceptionHandle> logger)
        {
            _logger = logger;
        }
        public override void OnException(ExceptionContext context)
    	{
         _logger.LogError(ex.Message, context.Exception);//调用
         }
    }

  Action调用:ServiceFilter

[ServiceFilter(typeof(ExceptionHandle))]
public IActionResult Index(DateTime dt, long sjc)
{
    var chushu = 0;
    var i = 1 / chushu;
    return View()
}

  

总结:定义继承自ExceptionFilterAttribute属性类的Filter文件类,重写OnException方法,如果不需要在属性类中做写日志,则删掉构造函数,自然也不需要在startup.cs文件中做依赖注入,用法也不需要使用

[ServiceFilter(typeof(ExceptionHandle))] 使用最传统的[ExceptionHandle]即可
//[ServiceFilter(typeof(ExceptionHandle))] 

[ExceptionHandle]
public IActionResult Index(DateTime dt, long sjc)
{
    var chushu = 0;
    var i = 1 / chushu;
    return View()
}

  

上一篇:在 ASP.NET Core 6.0 中使用 Serilog


下一篇:ASP 子程序北京上海