internal static async Task LogRequestAsync(this IDiagnosticsDbContext db, HttpContext?http, IPrincipalUser?principal) { if (http == null) { return; } principal ??= http.RequestServices.GetService <IPrincipalUser>(); var log = new RequestLog(); if (principal != null) { log.ReadValuesFromPrincipal(principal); } log.ReadValuesFromHttpContext(http); log.ComputeMd5Comparison(); var keyValueManager = http.RequestServices.GetService <IKeyValueManager>(); var seconds = keyValueManager?.LogRequestAsRepeatedIfSameWithinSeconds() ?? 60; var repeating = db.RequestLogs .OrderByDescending(x => x.Id) .Where(x => x.Md5Comparison == log.Md5Comparison) .Where(x => x.LastTime > DateTime.Now.AddSeconds(-seconds)) .FirstOrDefault(); if (repeating == null) { db.RequestLogs.Add(log); } else { repeating.Repeated++; repeating.LastTime = DateTime.Now; } await db.Normalize().SaveChangesAsync(); }