【问题标题】:How can I log all query parameters in an action filter?如何在操作过滤器中记录所有查询参数?
【发布时间】:2012-10-17 16:10:37
【问题描述】:

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

   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 方法中实现吗?

【问题讨论】:

标签: c# asp.net-mvc-3 logging action-filter


【解决方案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 值:

【讨论】:

  • filterContext.HttpContext.Request.Params 也会给我不想记录的服务器变量。 Request.InputStream 不捕获例如通过属性注入的用户名,到目前为止,我有filterContext.HttpContext.Request.QueryStringfilterContext.HttpContext.Request.FormfilterContext.ActionParameters 的组合。
猜你喜欢
  • 1970-01-01
  • 2013-11-11
  • 1970-01-01
  • 2021-11-03
  • 2018-08-20
  • 2018-07-18
  • 2016-09-22
  • 2019-11-04
  • 1970-01-01
相关资源
最近更新 更多