Я создаю приложение 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))] для действий, но безуспешно.
Может кто-нибудь мне помочь?