diff --git a/src/Squidex/Config/Web/WebServices.cs b/src/Squidex/Config/Web/WebServices.cs index fdb965701..af04bceed 100644 --- a/src/Squidex/Config/Web/WebServices.cs +++ b/src/Squidex/Config/Web/WebServices.cs @@ -45,6 +45,7 @@ namespace Squidex.Config.Web { options.Filters.Add(); options.Filters.Add(); + options.Filters.Add(); }).AddMySerializers(); services.AddCors(); diff --git a/src/Squidex/Pipeline/ETagExtensions.cs b/src/Squidex/Pipeline/ETagExtensions.cs index 3c6593ca7..4c30e2411 100644 --- a/src/Squidex/Pipeline/ETagExtensions.cs +++ b/src/Squidex/Pipeline/ETagExtensions.cs @@ -8,6 +8,7 @@ using System.Collections.Generic; using System.Linq; using Squidex.Infrastructure; +using Squidex.Infrastructure.Log; namespace Squidex.Pipeline { @@ -15,7 +16,10 @@ namespace Squidex.Pipeline { public static string ToManyEtag(this IEnumerable items, long total = 0) where T : IGenerateEtag { - return $"{total}_{string.Join(";", items.Select(x => $"{x.Id}{x.Version}"))}".Sha256Base64(); + using (Profiler.Trace("CalculateEtag")) + { + return $"{total}_{string.Join(";", items.Select(x => $"{x.Id}{x.Version}"))}".Sha256Base64(); + } } public static string ToSurrogateKeys(this IEnumerable items) where T : IGenerateEtag diff --git a/src/Squidex/Pipeline/MeasureResultFilter.cs b/src/Squidex/Pipeline/MeasureResultFilter.cs new file mode 100644 index 000000000..2d22afd65 --- /dev/null +++ b/src/Squidex/Pipeline/MeasureResultFilter.cs @@ -0,0 +1,32 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc.Filters; +using Squidex.Infrastructure.Log; + +namespace Squidex.Pipeline +{ + public sealed class MeasureResultFilter : IAsyncResultFilter, IAsyncActionFilter + { + public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) + { + using (Profiler.Trace("ExecuteAction")) + { + await next(); + } + } + + public async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next) + { + using (Profiler.Trace("ExecuteResult")) + { + await next(); + } + } + } +}