我正在实施一个记录器,它应该通过动作过滤器捕获细节,以便进行用户活动记录和故障查找。
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方法中实现此目的?
答案 0 :(得分:3)
为什么不简单地记录整个Request主体?这样,您将拥有重建用户请求所需的一切。
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
值: