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

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

ActionFilter:自定义过滤器

自定义过滤器,主要是监控action请求前后,处理结果返回前后的事件。其中API只有请求前后的两个方法。

重新方法

方法功能描述

使用于

OnActionExecuting

一个请求在进入到aciton逻辑前执行

MVC、API

OnActionExecuted

一个请求aciton逻辑执行后执行

MVC、API

OnResultExecuting

对应的view视图渲染前执行

MVC

OnResultExecuted

对应的view视图渲染后执行

MVC

在这几个方法中,我们一般主要用来记录交互日志,记录每一个步骤的耗时情况,以便后续系统优化使用。具体的使用,根据自身的业务场景使用。

其中MVC和API的异同点,和上面说的认证授权的异同类似,不在详细说明。

下面的一个实例代码:

API定义过滤器实例DEMO代码

/// <summary>
 /// Action过滤器
 /// </summary>
 public class XYHAPICustomActionFilterAttribute : ActionFilterAttribute
 {
  /// <summary>
  /// Action执行开始
  /// </summary>
  /// <param name="actionContext"></param>
  public override void OnActionExecuting(HttpActionContext actionContext)
  {

  }

  /// <summary>
  /// action执行以后
  /// </summary>
  /// <param name="actionContext"></param>
  public override void OnActionExecuted(HttpActionExecutedContext actionContext)
  {
   try
   {
    // 构建一个日志数据模型
    MApiRequestLogs apiRequestLogsM = new MApiRequestLogs();

    // API名称
    apiRequestLogsM.API = actionContext.Request.RequestUri.AbsolutePath;

    // apiKey
    apiRequestLogsM.API_KEY = HttpContext.Current.Request.QueryString["ApiKey"];

    // IP地址
    apiRequestLogsM.IP = FilterAttributeHelp.GetIPAddress(actionContext.Request);

    // 获取token
    string token = HttpContext.Current.Request.Headers.GetValues("Token") == null ? string.Empty :
        HttpContext.Current.Request.Headers.GetValues("Token")[0];
    apiRequestLogsM.TOKEN = token;

    // URL
    apiRequestLogsM.URL = actionContext.Request.RequestUri.AbsoluteUri;

    // 返回信息
    var objectContent = actionContext.Response.Content as ObjectContent;
    var returnValue = objectContent.Value;
    apiRequestLogsM.RESPONSE_INFOR = returnValue.ToString();

    // 由于数据库中最大只能存储4000字符串,所以对返回值做一个截取
    if (!string.IsNullOrEmpty(apiRequestLogsM.RESPONSE_INFOR) &&
     apiRequestLogsM.RESPONSE_INFOR.Length > 4000)
    {
     apiRequestLogsM.RESPONSE_INFOR = apiRequestLogsM.RESPONSE_INFOR.Substring(0, 2000);
    }

    // 请求参数
    apiRequestLogsM.REQUEST_INFOR = actionContext.Request.RequestUri.Query;

    // 定义一个异步委托 ,异步记录日志
    // Func<MApiRequestLogs, string> action = AddApiRequestLogs;//声明一个委托
    // IAsyncResult ret = action.BeginInvoke(apiRequestLogsM, null, null);

   }
   catch (Exception ex)
   {

   }
  }
 }