Nano Hash - криптовалюты, майнинг, программирование

Переопределить глобальный фильтр действий в контроллере / действии в ASP.NET Core MVC 1.0.1 (ASP.NET Core 1.1)

Я создаю приложение ASP.NET Core MVC и пытаюсь создать глобальный фильтр действий, который регистрирует, сколько времени потрачено на выполнение действия (оно должно регистрироваться только в том случае, если потраченное время превышает некоторый порог). Я успешно сделал это, но теперь я хочу сказать, что одно действие или один контроллер должны иметь другой порог. Когда я пытаюсь это сделать, мой фильтр действий применяется дважды (чего я не хочу), но с правильными двумя разными порогами.

Я пробовал довольно много вещей и искал. В проектах MVC 3 и MVC 4 я успешно сделал это с помощью RegisterGlobalFilters () в Global.asax, и он автоматически переопределяет глобальный, когда я использовал атрибут в контроллере / действии. Я также безуспешно пробовал подход, описанный в этом посте:

Переопределить глобальный фильтр авторизации в ASP.NET Core MVC 1.0

Мой код для моего ActionFilterAttribute:

public class PerformanceLoggingAttribute : ActionFilterAttribute
{
    public int ExpectedMax = -1; // Log everything unless this is explicitly set
    private Stopwatch sw;

    public override void OnActionExecuting(ActionExecutingContext context)
    {
        sw = Stopwatch.StartNew();
    }

    public override void OnActionExecuted(ActionExecutedContext context)
    {
        sw.Stop();
        if (sw.ElapsedMilliseconds >= ExpectedMax)
        {
            // Log here
        }
    }

    //public override Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    //{
    //    // If there is another performance filter, do nothing
    //    if (context.Filters.Any(item => item is PerformanceLoggingAttribute && item != this))
    //    {
    //        return Task.FromResult(0);
    //    }
    //    return base.OnActionExecutionAsync(context, next);
    //}
}

Я применяю этот глобальный фильтр в моем Startup.cs:

services.AddMvc(options =>
            {
                if (_env.IsProduction()) options.Filters.Add(new RequireHttpsAttribute());
                //options.Filters.Add(new PerformanceLoggingFilter() { ExpectedMax = 1 }); // Add Performance Logging filter
                options.Filters.Add(new PerformanceLoggingAttribute() { ExpectedMax = 1 }); // Add Performance Logging filter
            });

И в своем контроллере я применяю атрибут:

//[TypeFilter(typeof(PerformanceLoggingFilter))]
[PerformanceLogging(ExpectedMax = 2)]
public IActionResult Index()
{
    var vm = _performanceBuilder.BuildPerformanceViewModel();
    return View(vm);
}

Как вы можете видеть из приведенных выше фрагментов кода, я пробовал подход OnActionExecutionAsync, а также вместо этого пробовал использовать IActionFilter и использовать [TypeFilter (typeof (PerformanceLoggingFilter))] для действий, но безуспешно.

Может кто-нибудь мне помочь?


Ответы:


1

Могу предложить вам несколько иную реализацию того, чего вы пытаетесь достичь, используя один фильтр действий и дополнительный настраиваемый атрибут:

  • создайте новый простой атрибут (назовем его ExpectedMaxAttribute), который просто содержит значение ExpectedMax. Примените этот атрибут к действиям контроллера с разными значениями.

  • оставьте свой PerformanceLogging фильтр действий глобальным, но измените реализацию. В методе OnActionExecuted проверьте, имеет ли действие контроллера ExpectedMaxAttribute. Если да, то считайте значение ExpectedMax из атрибута, в противном случае используйте значение по умолчанию из фильтра действий.


Кроме того, я рекомендую вам переименовать фильтр действий в соответствии с соглашением о названии чего-то вроде PerformanceLoggingActionFilter.

09.03.2017
  • Ваш ответ привел меня на правильный путь. Я опубликовал свое решение в качестве ответа. Спасибо! 10.03.2017

  • 2

    У меня это работает благодаря ответу @ Set выше в сочетании с этим ответом: https://stackoverflow.com/a/36932793/5762645 < / а>

    В итоге я получил глобальное действие, которое применяется ко всем действиям, а затем получил простой атрибут ExpectedMaxAttribute, который я наложил на действия, в которых порог должен быть другим. Затем в OnActionExecuted моего глобального фильтра действий я проверяю, прикреплен ли к рассматриваемому действию атрибут ExpectedMaxAttribute, а затем читаю из него ExpectedMax. Ниже мой атрибут:

    public class PerformanceLoggingExpectedMaxAttribute : ActionFilterAttribute
    {
        public int ExpectedMax = -1;
    }
    

    И часть OnActionExecuted, которую я добавил в свой ActionFilter:

     public override void OnActionExecuted(ActionExecutedContext context)
     {
         sw.Stop();
         foreach (var filterDescriptor in context.ActionDescriptor.FilterDescriptors)
         {
             if (filterDescriptor.Filter is PerformanceLoggingExpectedMaxAttribute)
             {
                 var expectedMaxAttribute = filterDescriptor.Filter as PerformanceLoggingExpectedMaxAttribute;
                 if (expectedMaxAttribute != null) ExpectedMax = expectedMaxAttribute.ExpectedMax;
                 break;
             }
         }
         if (sw.ElapsedMilliseconds >= ExpectedMax)
         {
             _logger.LogInformation("Test log from PerformanceLoggingActionFilter");
         }
     }
    
    10.03.2017
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..