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)
{
}
}
}








