Для каждого действия создается экземпляр ActionFilterAttribute? - PullRequest
0 голосов
/ 13 февраля 2020

Я хочу иметь поле в ActionFilterAttribute, которое относится только к действию, в котором оно живет, например,

    public class TimedAction : ActionFilterAttribute
    {
        long start, end;

        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            start = Stopwatch.GetTimestamp();

            base.OnActionExecuting(actionContext);
        }

        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            base.OnActionExecuted(actionExecutedContext);

            end = Stopwatch.GetTimestamp();
        }
    }

Можно ли предположить, что TimedAction будет создаваться для каждого действия вызова API?

РЕДАКТИРОВАТЬ: я изменил код на это, и теперь кажется, что запросы являются общими (что ??), и я получаю исключение, когда я пытаюсь добавить keyvaluepair: An item with the same key has already been added.

        public override void OnActionExecuting(HttpActionContext context)
        {
            var start = Stopwatch.GetTimestamp();

            context.Request.Properties.Add(new KeyValuePair<string, object>("Stopwatch", start));

            base.OnActionExecuting(context);
        }

        public override void OnActionExecuted(HttpActionExecutedContext context)
        {
            base.OnActionExecuted(context);

            var end = Stopwatch.GetTimestamp();

            object o;
            long start = 0;
            if (context.Request.Properties.TryGetValue("Stopwatch", out o))
            {
                start = (long)o;
            }
        }

Ответы [ 2 ]

3 голосов
/ 13 февраля 2020

Не делайте этого, так как атрибуты статически определены. Вам необходимо сохранить это в запросе, например, HttpContext.Current.Items["SomeKey"]:

public override void OnActionExecuting(HttpActionContext actionContext)
{
    HttpContext.Current.Items["Now"] = DateTime.UtcNow;

    base.OnActionExecuting(actionContext);
}

public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
    var beginning = (DateTime) HttpContext.Current.Items["Now"];

    var end = DateTime.UtcNow;

    var interval = end - beginning;

    base.OnActionExecuted(actionExecutedContext);
}
0 голосов
/ 14 февраля 2020

Видимо, нет никакой разницы между тем, что я сделал (см. Код в ОП) и подходом @RicardoPeres.

Проблема заключалась в том, что я случайно установил атрибут дважды для метода.

И все же я чувствую, что версия Рикардо лучше моей, поэтому я сохранил ее.

...