聊一聊Asp.net过滤器Filter那一些事

2020-06-09 12:59:55王旭

API 的异常处理实例代码:

 /// <summary>
 /// API自定义异常处理机制
 /// 说道异常处理,其实我们脑海中的第一反应,也该是try/cache操作
 /// 但是在实际开发中,很有可能地址错误根本就进入不到try中,又或者没有被try处理到异常
 /// 该类就发挥了作用,能够很好的未经捕获的异常,并做相应的逻辑处理
 /// 自定义异常机制,主要集成ExceptionFilterAttribute 重写其OnException方法
 /// </summary>
 public class XYHAPIHandleError : ExceptionFilterAttribute
 {
  /// <summary>
  /// 处理异常
  /// </summary>
  /// <param name="actionExecutedContext">异常上下文</param>
  public override void OnException(HttpActionExecutedContext actionExecutedContext)
  {
   // 我们在平时的项目中,异常处理一般有两个作用
   // 1:记录异常的详细日志,便于事后分析日志
   // 2:对异常的统一友好处理,比如根据异常类型重定向到友好提示页面

   // 在这里面既能获取到未经处理的异常信息,也能获取到请求信息
   // 在此可以根据实际项目需要做相应的逻辑处理
   // 下面简单的列举了几个关键信息获取方式

   // action名称 
   string actionName = actionExecutedContext.ActionContext.ActionDescriptor.ActionName;

   // 控制器名称 
   string controllerName =actionExecutedContext.ActionContext.ControllerContext.ControllerDescriptor.ControllerName;

   // url完整地址
   string url = (actionExecutedContext.Request.RequestUri.AbsoluteUri).ExUrlDeCode();

   // 请求方式 post get
   string httpMethod = actionExecutedContext.Request.Method.Method;

   // 请求IP地址
   string ip = actionExecutedContext.Request.GetIPAddress();

   // 获取全部的请求参数
   HttpRequest httpRequest = HttpContext.Current.Request;
   Dictionary<string, string> queryParameters = httpRequest.GetAllQueryParameters();

   // 获取异常对象
   Exception ex = actionExecutedContext.Exception;

   // 异常描述信息
   string exMessage = ex.Message;

   // 异常堆栈信息
   string stackTrace = ex.StackTrace;

   // 根据实际情况记录日志(文本日志、数据库日志,建议具体步骤采用异步方式来完成)
   // 自己的记录日志落地逻辑略 ......

   // 构建统一的内部异常处理机制,相当于对异常做一层统一包装暴露
   MBaseResult<string> result = new MBaseResult<string>()
   {
    Code = MResultCodeEnum.systemErrorCode,
    Message = MResultCodeEnum.systemError
   };

   actionExecutedContext.Response = new HttpResponseMessage(HttpStatusCode.OK);
   //需要自己指定输出内容和类型
   HttpContext.Current.Response.ContentType = "text/html;charset=utf-8";
   HttpContext.Current.Response.Write(JsonConvert.SerializeObject(result));
   HttpContext.Current.Response.End(); // 此处结束响应,就不会走路由系统
  }
 }

总结

.net过滤器,我个人的一句话理解就是:对action的各个阶段进行统一的监控处理等操作。.net过滤器中,其中每一个种过滤器的执行先后顺序为:Authorize(授权)-->ActionFilter(自定义)-->HandleError(错误处理)