Ответ 1
Тело запроса представляет собой поток без перемотки; его можно читать только один раз. Форматтер уже прочитал поток и заполнил модель. Мы не можем прочитать поток снова в фильтре действий.
Вы можете попробовать:
public class LogAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
var myModel = actionContext.ActionArguments["myModel"];
}
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
var myModel = actionContext.ActionArguments["myModel"];
}
}
Собственно, ActionArguments
- это просто словарь, мы можем его зацикливать, если нам нужно избегать жестко заданного имени параметра ("myModel"
). Когда мы создаем общий фильтр действий, который должен работать над классом похожих объектов для некоторых конкретных требований, мы могли бы реализовать наши модели интерфейса = > знать, какой аргумент является моделью, над которой нам нужно работать, и мы можем вызывать методы, хотя интерфейс.
Пример кода:
public class LogAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
foreach(var argument in actionContext.ActionArguments.Values.Where(v => v is ILogable)))
{
ILogable model = argument as ILogable;//assume that only objects implementing this interface are logable
//do something with it. Maybe call model.log
}
}
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
foreach(var argument in actionContext.ActionArguments.Values.Where(v => v is ILogable)))
{
ILogable model = argument as ILogable;//assume that only objects implementing this interface are logable
//do something with it. Maybe call model.log
}
}
}