我如何登录一个动作过滤器的所有查询参数?(How can I log all query param

2019-09-24 05:36发布

我采取的是应通过对用户行为记录和故障查找的目的的动作捕捉过滤器的详细信息的记录器。

   public interface ISessionLogger
    {
        void LogUserActionSummary(int sessionId, string userActionType);    
        void LogUserActionDetail(int session, string userActionType, DateTime userActionStartedUtc, long actionDurationInMilliseconds, string queryParams, string referredFrom);
    }

我想queryParams捕捉从形式收集,路由值,操作参数,可以JSON调用和查询字符串,这听起来像我需要所有键和值

filterContext.Controller.ValueProvider

但它似乎并不可能遍历这个。 所以在我的FilterAttribute我有

public void OnActionExecuting(ActionExecutingContext filterContext)
{
    var paramList = new List<string>();
    if(filterContext.ActionParameters != null)
    {
        paramList.AddRange(filterContext.ActionParameters.Select(param => String.Format("{0}:{1}", param.Key, param.Value.ToString())));
    }
    if(filterContext.Controller.ValueProvider != null)
    {
        //loop through the valueprovider and save the key value pairs to paramList
    }

    _queryParams = string.Join(",", paramList);
}

有另一种方式来行动滤波器的OnActionExecuting方法中实现这一目标?

Answer 1:

你为什么不只需登录整个请求主体? 这样,您将拥有一切你需要重建用户请求。

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    var stream = filterContext.HttpContext.Request.InputStream;
    var data = new byte[stream.Length];
    stream.Read(data, 0, data.Length);
    Log(Encoding.UTF8.GetString(data));
}

作为一种替代你可以尝试记录所有filterContext.HttpContext.Request.Params值以及filterContext.RouteData值:



文章来源: How can I log all query parameters in an action filter?