首页 > 编程 > .NET > 正文

asp.net core MVC 全局过滤器之ExceptionFilter过滤器(1)

2020-01-17 22:18:32
字体:
来源:转载
供稿:网友

本系类将会讲解asp.net core MVC中的内置全局过滤器的使用,将分为以下章节

  asp.net core MVC 过滤器之ExceptionFilter过滤器(一)

  asp.net core MVC 过滤器之ActionFilter过滤器(二)

  asp.net core MVC 过滤器之ResultFilter过滤器(三)

  asp.net core MVC 过滤器之ResourceFilter过滤器(四)

  asp.net core MVC 过滤器之AuthorizationFilter过滤器(五)  

简介

异常过滤器,顾名思义,就是当程序发生异常时所使用的过滤器。用于在系统出现未捕获异常时的处理。

实现一个自定义异常过滤器

自定义一个全局异常过滤器需要实现IExceptionFilter接口

public class HttpGlobalExceptionFilter : IExceptionFilter  {    public void OnException(ExceptionContext context)    {      throw new NotImplementedException();    }  }

IExceptionFilter接口会要求实现OnException方法,当系统发生未捕获异常时就会触发这个方法。OnException方法有一个ExceptionContext异常上下文,其中包含了具体的异常信息,HttpContext及mvc路由信息。系统一旦出现未捕获异常后,比较常见的做法就是使用日志工具,将异常的详细信息记录下来,方便修正调试。下面是日志记录的实现。  

  /// <summary>  /// 全局异常过滤器  /// </summary>  public class HttpGlobalExceptionFilter : IExceptionFilter  {    readonly ILoggerFactory _loggerFactory;    readonly IHostingEnvironment _env;    public HttpGlobalExceptionFilter(ILoggerFactory loggerFactory, IHostingEnvironment env)    {      _loggerFactory = loggerFactory;      _env = env;    }    public void OnException(ExceptionContext context)    {      var logger = _loggerFactory.CreateLogger(context.Exception.TargetSite.ReflectedType);        logger.LogError(new EventId(context.Exception.HResult),        context.Exception,        context.Exception.Message);        var json = new ErrorResponse("未知错误,请重试");        if (_env.IsDevelopment()) json.DeveloperMessage = context.Exception;        context.Result = new ApplicationErrorResult(json);        context.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;      context.ExceptionHandled = true;    }public class ApplicationErrorResult : ObjectResult  {    public ApplicationErrorResult(object value) : base(value)    {      StatusCode = (int)HttpStatusCode.InternalServerError;    }  }public class ErrorResponse  {    public ErrorResponse(string msg)    {      Message = msg;    }    public string Message { get; set; }    public object DeveloperMessage { get; set; }  }

注册全局过滤器

过滤器已经编写完毕,接下来就需要在asp.net core MVC中注册。找到系统根目录Startup.cs文件,修改ConfigureServices方法如下

 services.AddMvc(options =>      {        options.Filters.Add<HttpGlobalExceptionFilter>();      });

测试

在请求中抛出一个异常

日志正确捕获到异常信息

浏览器返回500错误,并且返回自定义的错误信息。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表