Как я могу регистрировать все параметры запроса в фильтре действий?

Я реализую регистратор, который должен фиксировать детали через фильтр действий для записи действий пользователя и поиска неисправностей.

   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 фильтра действий?


person friedX    schedule 17.10.2012    source источник
comment
Вы проверили MSDN для получения более подробной информации о ValueProvider? - msdn.microsoft. com/ru-ru/library/   -  person KyorCode    schedule 19.10.2012


Ответы (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:

person Darin Dimitrov    schedule 19.10.2012
comment
filterContext.HttpContext.Request.Params также даст мне серверные переменные, которые я не хочу регистрировать. Request.InputStream не фиксирует, например. имя пользователя, введенное через атрибут, пока у меня есть комбинация filterContext.HttpContext.Request.QueryString, filterContext.HttpContext.Request.Form и filterContext.ActionParameters. - person friedX; 19.10.2012