4

我正在实现一个记录器,该记录器应通过操作过滤器捕获详细信息,以用于用户活动记录和故障查找。

   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 方法中是否有另一种方法来实现这一点?

4

1 回答 1

4

为什么不简单地记录整个请求正文?这样,您将拥有重建用户请求所需的一切。

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值:

于 2012-10-19T08:01:17.590 回答