2017-09-14 64 views
1

我期待创建一个实现IAsyncActionFilter的过滤器,它将从当前请求的上下文的ActionParameters及其Result中检索数据。我正在使用自定义属性MyLogAttribute来指导伐木行为,例如选择加入日志并显示包含关键信息的字段。ASP.NET核心AsyncActionFilter记录ActionArguments和结果

public class AsyncMyLogFilter : IAsyncActionFilter 
{ 
    public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) 
    { 
     var actionDescriptor = context.ActionDescriptor as ControllerActionDescriptor; 

     if (actionDescriptor != null) 
     { 
      var attribute = actionDescriptor.MethodInfo.GetCustomAttribute<MyLogAttribute>(); 

      if (attribute != null) 
      { 

       await next(); 

       // This is where the magic is supposed to happen: 
       LoggerHelper.Log(context.ActionArguments, context.Result); 
      } 

      return; 
     } 

     await next(); 
    } 
} 

方式的滤波器提供next()委托使我相信,过去的这一点上,行动将完成,可用于检查作为ObjectResult结果对象。但是,尽管过滤器能够毫无问题地获取ActionArguments,但不幸的是Result属性为空,这根本没有帮助。

明显的替代方案,同步IActionFilter,让我检查的OnActionExecuted阶段Result对象,但在这一点上ActionArguments字典不可用。

那么,有没有办法在相同的方法范围内访问ActionArgumentsResult

-S

+0

参数在ActionExecutedContext.ActionDescriptor.Parameters?上不可用吗? –

+0

Parameters集合包含参数的名称和类型,但似乎不包含它们的值。 –

回答

0

虽然原始形式的问题一直没有解决,我是能够创建具有IActionFilter一个解决办法:

public class ActivityLogFilter : IActionFilter 
{ 
    public void OnActionExecuting(ActionExecutingContext context) 
    { 
     var actionDescriptor = context.ActionDescriptor as ControllerActionDescriptor; 

     if (actionDescriptor != null) 
     { 
      var attribute = actionDescriptor.MethodInfo.GetCustomAttribute<MyLogAttribute>(); 

      if (attribute != null) 
      { 
       context.HttpContext.Items["MyLogData"] = GetRelevantLogData(context.ActionArguments); // Apply some custom logic to select relevant log data 
      } 
     } 

     public void OnActionExecuted(ActionExecutedContext context) 
     { 
      var actionDescriptor = context.ActionDescriptor as ControllerActionDescriptor; 

      if (actionDescriptor != null) 
      { 
       var attribute = actionDescriptor.MethodInfo.GetCustomAttribute<MyLogAttribute>(); 

       if (attribute != null) 
       { 
        var actionParametersData = (MyActionParametersLogData)context.HttpContext.Items["MyLogData"] 

        LoggerHelper.Log(actionParametersData, context.Result); 
       } 
      } 
     } 
    } 
} 

不完全火箭科学;它看起来有点脆弱(“如果我的HttpContext项目失踪!?”),但它似乎能完成这项工作。

-S